के रूप में अन्य लोगों ने बताया है, समस्या क्योंकि 0.1
और 0.05
चल बिंदु मशीन में एक सटीक अभ्यावेदन नहीं है। यहाँ सबसे सरल समाधान के बजाय छोटा के लिए, बस परिणाम दौर के लिए है:
pennies = round((amount - nickels * 0.05)/0.01);
इस विशेष मामले (जहां सिक्कों के साथ काम कर रहे हैं) में एक बेहतर समाधान हर जगह पूर्णांकों उपयोग करने के लिए बस है, और सब कुछ करने के डॉलर के बजाय सेंट के संदर्भ में। यह बंद हो जाता है काम कर रहे हैं (या कुछ बहुत ही जटिल प्रोग्रामिंग की आवश्यकता है) लेकिन बहुत जल्दी: की गणना वैट या बिक्री कर कारण समस्याओं की तरह भी बातें।
double
उपयोग करना जारी रखें, के रूप में आवश्यक गोलाई: इस तरह के मामलों के लिए, वहाँ दो संभव समाधान हैं। यह सरल और सबसे सामान्य समाधान है। सावधान रहें, हालांकि, इसका उपयोग करते समय, बाइनरी मानों पर गोलिंग किया जाता है, और कुछ मामलों में दशमलव मानों के साथ आपको क्या मिलेगा उससे भिन्न होता है। अंतर काफी छोटा है कि यह हर दिन के उपयोग के लिए कोई फर्क नहीं होगा होना चाहिए, लेकिन ज्यादातर देशों कानूनों को निर्दिष्ट कैसे इस तरह के मूल्यों गोल किया जाना चाहिए है, और उन गोलाई नियम हमेशा दशमलव में निर्दिष्ट हैं। जिसका अर्थ है कि यह समाधान उन मामलों में उपयोग नहीं किया जा सकता है जहां कानूनी आवश्यकताओं (उदाहरण के लिए बिक्री कर, कॉर्पोरेट बहीखाता इत्यादि की गणना) हो।
उपयोग दशमलव वर्ग किसी प्रकार का। नेटवर्क पर उपलब्ध नंबर उपलब्ध हैं। इसके परिणामस्वरूप धीमे निष्पादन के समय होंगे। (आमतौर पर, कौन परवाह करता है।आपको 10 के बजाय 100 माइक्रोसॉन्ड में परिणाम मिलेंगे लेकिन अपवाद हैं; जैसे जब मोंटे कार्लो सिमुलेशन
भी कर रही है।), जैसा कि आप जानते हैं जब बड़े मूल्यों शामिल कर रहे हैं होना चाहिए। आपके व्यक्तिगत वित्त के लिए, यह लगभग निश्चित रूप से अप्रासंगिक है, लेकिन int
का अधिकतम मूल्य है, और एक बिंदु है जहां double
अब पूर्णांक मानों का सही ढंग से प्रतिनिधित्व नहीं कर सकता है।
बेशक
, अगर यह, सीखने सी ++ में मदद करने के लिए सिर्फ round
या पूर्णांकों का उपयोग करें, और बाकी के बारे में बहुत ज्यादा चिंता नहीं है सिर्फ एक व्यायाम है।
और आपकी टिप्पणी के लिए "सी ++ पहले से ही मुझे खो रहा है": इसमें सी ++ प्रति से कोई लेना देना नहीं है। आपको लगभग किसी भी प्रोग्रामिंग भाषा में लगभग (लगभग) समस्याएं आती हैं।
स्रोत
2013-08-06 09:03:17
http://floating-point-gui.de –
जब आप परिणाम 'पैनीज़' में संग्रहीत करते हैं, तो मूल्य गोलाकार के बजाय छोटा हो जाता है। 'Int pennies = 1.9 आज़माएं; std :: cout << पेनी; 'अपने लिए देखने के लिए। – jrok
मुझे यकीन है कि लोग इस तरह के किसी मुद्दे के साथ मदद कर सकते हैं, लेकिन भविष्य में आपको उदाहरण डेटा शामिल करना चाहिए ताकि हम जान सकें कि "ऑफ" से आपका क्या मतलब है (उदाहरण के लिए "जब' राशि '10 है और 'निकल' 5 है मैं परिणाम 12 होने की उम्मीद करता हूं लेकिन यह 13 है। ") – JJJ