2012-03-14 14 views
56

संभव डुप्लिकेट:
round() for float in C++सी ++: एक int के लिए डबल कैसे गोल करें?

मैं एक डबल है (फोन यह x), मतलब 55 होने के लिए लेकिन वास्तविकता में 54.999999999999943157 जो मैं सिर्फ महसूस किया के रूप में जमा।

तो जब मैं

double x = 54.999999999999943157; 
int y = (int) x; 

y = 54 55 के बजाय करते हैं!

यह मुझे लंबे समय तक परेशान करता है। मैं इसे सही तरीके से कैसे प्राप्त करूं?

+1

आप संख्या में 0.5 जोड़ सकते हैं और फिर अपनी कास्ट को एक int में छंटनी करने के लिए कर सकते हैं। क्या आपको नकारात्मक संख्याओं को गोल करने की ज़रूरत है? – Blastfurnace

+1

आप इस प्रीप्रोसेसर परिभाषा का उपयोग कर सकते हैं: '# परिभाषित ROUND_2_INT (एफ) ((int) (f> = 0.0? (F + 0.5): (f - 0.5))) – c00000fd

+0

असल में 54.9 99 99 99 99 99 9943157 8 यूएलपी नीचे _exactly representable_ 55 है 'डबल' से आपका मतलब आईईईई 754 से बाइनरी 64 है। तो यह नहीं है कि वास्तव में 55 कैसे संग्रहीत किया जाता है, इसका परिणाम यह है कि इसकी गणना कितनी कमजोर थी। – Ruslan

उत्तर

85

0,5 जोड़ने या घटाना 0.5 (अगर एक्स < 0), क्योंकि संकलक हमेशा काटना होगा।

float x = 55; // stored as 54.999999... 
x = x + 0.5; // x is now 55.499999... 
int y = (int)x; // truncated to 55 

सी ++ 11 भी परिचय std::round है, जो की संभावना को जोड़ने 0.5 की एक ऐसी ही तर्क का उपयोग करता | x | हुड के नीचे (यदि दिलचस्पी है तो लिंक देखें) लेकिन जाहिर है और अधिक मजबूत है।

एक अनुवर्ती प्रश्न हो सकता है क्यों नाव वास्तव में 55 में स्पष्टीकरण के लिए के रूप में जमा नहीं है, this stackoverflow जवाब देखें।

+0

धन्यवाद ... यह वास्तव में बहुत आसान है – midnightBlue

+0

यह केवल int y = x + 0.5 के साथ समान रूप से काम करेगा; यद्यपि सही है? – midnightBlue

+0

हाँ, मुझे ऐसा लगता है। – Moritz

31

कास्टिंग गणितीय परिचालन नहीं है और ऐसा व्यवहार नहीं करता है। कास्टिंग से पहले (यदि x> 0) की कोशिश करो

int y = (int)round(x); 
+7

कलाकार अनावश्यक है; नतीजा पूरी तरह से 'int' में परिवर्तित हो जाएगा। –

+5

मैं कभी भी सी प्रकार के पदोन्नति नियमों को याद नहीं कर सकता था और मुझे लगता है कि यह राज्य के प्रकार को हर जगह स्पष्ट रूप से प्रभावित नहीं करता है, यह एक चिपचिपा मुद्दा है। –

+0

किस लाइब्रेरी का 'राउंड' हिस्सा है? AFAIK यह सी ++ मानक पुस्तकालय में नहीं है। 'छत 'और' मंजिल' उपलब्ध हैं। –

4

int पर कास्ट मूल्य को कम करता है। 0.5 जोड़ना उचित गोल करने का कारण बनता है।

int y = (int)(x + 0.5); 
+3

नकारात्मक संख्याओं के लिए मान्य नहीं है, जैसा उपरोक्त टिप्पणियों में से एक में उल्लिखित है। यदि आप ऐसा कर रहे हैं तो कास्ट के बजाय 'मंजिल' का उपयोग कर सकते हैं। –

3

यह ध्यान देने योग्य है कि आप जो कर रहे हैं वह गोल नहीं है, यह कास्टिंग है। (int) x का उपयोग कर कास्टिंग x के दशमलव मान को कम करता है। आपके उदाहरण में, यदि x = 3.9995, .9995 छोटा हो जाता है और x = 3 हो जाता है।

जैसा कि कई अन्य लोगों द्वारा प्रस्तावित किया गया है, एक समाधान 0.5x को जोड़ने और फिर कास्ट करना है।

+0

धन्यवाद, असल में मुझे केवल एहसास हुआ कि मुझे गोल करने की भी आवश्यकता है (मैं अपने कार्यक्रम में केवल पूर्णांक का उपयोग कर रहा हूं) – midnightBlue

-4
#include <iostream> 
#include <cmath> 
using namespace std; 

int main() 
{ 
    double x=54.999999999999943157; 
    int y=ceil(x);//The ceil() function returns the smallest integer no less than x 
    return 0; 
} 
+5

हालांकि यह बल संख्याएं बढ़ी हैं ... 54.000000000000001 55 हो जाएगा। –

+1

@AlbertRenshaw, दाएं - जिसका अर्थ है कि यह उत्तर गलत है । –