2011-07-05 9 views
5

मैं जावास्क्रिप्ट के साथ एक बजट आवेदन बना रहा हूं। मुझे जावास्क्रिप्ट को अधिकांश परिचालन करना है। तो मेरे पास कुछ नियंत्रण हैं जहां उपयोगकर्ता श्रेणी के लिए वांछित राशि बदलता है और मेरा एप्लिकेशन उपश्रेणियों के लिए नई रकम दिखाता है। तो अगर मैं है + ऑटो $ 50.23 - गैस $ 30.25 - रखरखाव $ 6.27 - बीमा $ 10.02 - उपयोगकर्ता परिवर्तन ...जावास्क्रिप्ट के साथ मुद्रा संचालन?

तो अगर ऑटो 50.23 90.00, गैस, रखरखाव, बीमा, आदि के लिए मात्रा में उनकी मूल श्रेणी में% वृद्धि को दर्शाएगा।

समस्या यह है कि कुछ परिचालनों के बाद मैंने परिशुद्धता खो दी और यह कुछ गड़बड़ी पैदा करता है। अधिकांश बार संख्याएं जोड़ती नहीं हैं (जैसा कि उन्हें करना चाहिए)। ऑटो के लिए कुछ बार मात्रा बदलने के बाद और फिर इसे 0 पर सेट करने के बाद, अन्य रकम हमेशा 0 पर नहीं जातीं, और कभी-कभी वे 0 से नीचे जाते हैं जो मुझे NaN देते हैं, इसलिए यदि मैं बाद में 0 से अधिक कुछ के लिए ऑटो बदलता हूं, मेरा नाएन नाएन रहेगा।

मैंने अभी सुना है कि जावास्क्रिप्ट में भिन्नता अनुमानित हैं जो एक और समस्या है। मैंने यह देखने के लिए Google की कोशिश की कि यह एक तथ्य है, लेकिन कुछ भी नहीं मिला (शायद मैंने सही शर्तों की तलाश नहीं की थी)

मुझे यकीन है कि आप में से कुछ समान समस्याओं में भाग गए हैं, आप क्या करेंगे सुझाना? किसी ने मेरे मूल नंबर को 100 से गुणा करने का सुझाव दिया और फिर सभी परिचालनों को करने का सुझाव दिया, लेकिन मुझे डर है कि यह मुझे सटीकता खोने की समस्या से दूर होने में मदद नहीं करेगा।

कोई विचार?

मैं आपकी मदद की सराहना करता हूं!

+0

जेएस में प्रत्येक नंबर एक फ़्लोटिंग पॉइंट नंबर है, लेकिन आपको 2-प्लेस नंबरों पर इतना सटीकता नहीं खोनी चाहिए। एफपी राउंडिंग एक समस्या बनने से पहले आपको सचमुच हजारों या लाखों पुनरावृत्तियों की आवश्यकता होगी। क्या आप अपने कोड का प्रासंगिक बिट दिखा सकते हैं जहां आप गणना करते हैं? हमें पूरे पृष्ठ की आवश्यकता नहीं है, बस इतना छोटा सा। –

+0

अच्छी तरह से आप संभवतः डॉलर और सेंट (सभी पूर्णांक) जैसे गुणों के साथ अपनी खुद की कक्षा बना सकते हैं और अपने स्वयं के संचालन को लागू कर सकते हैं – spacevillain

+0

एफपी अतिरिक्त त्रुटियां जावास्क्रिप्ट में सबसे अधिक रिपोर्ट की गई त्रुटियां हैं। – jzilla

उत्तर

9

बाइनरी फ़्लोटिंग-पॉइंट संख्या दशमलव अंशों को संभालने में अक्षम हैं, इसलिए 0.1 + 0.2 0.3 के बराबर नहीं है। यह जावास्क्रिप्ट में सबसे अधिक बार रिपोर्ट की गई बग है, और यह बाइनरी फ़्लोटिंग-पॉइंट अंकगणितीय (आईईईई 754) के लिए आईईईई मानक को अपनाए जाने का एक जानबूझकर परिणाम है। यह मानक कई अनुप्रयोगों के लिए उपयुक्त है, लेकिन यह उन अधिकांश चीजों का उल्लंघन करता है जिन्हें आपने मिडिल स्कूल में संख्याओं के बारे में सीखा। सौभाग्य से, फ्लोटिंग पॉइंट में पूर्णांक अंकगणितीय सटीक है, इसलिए स्केलिंग द्वारा दशमलव प्रतिनिधित्व त्रुटियों से बचा जा सकता है। उदाहरण के लिए, डॉलर मूल्यों को 100 से गुणा करके पूरे सेंट मूल्यों में परिवर्तित किया जा सकता है। सेंट को सटीक रूप से जोड़ा जा सकता है। डॉलर में वापस परिवर्तित करने के लिए योग 100 से विभाजित किया जा सकता है। लोगों के पास उचित अपेक्षा है जब वे पैसे की गणना करते हैं कि परिणाम सटीक होंगे।

"जावास्क्रिप्ट: डगलस क्रॉकफोर्ड द्वारा गुड पार्ट्स। कॉपीराइट 2008 याहू! इंक, 978-0-596-51774-8।"

3

हमेशा मुद्रा के साथ आंतरिक रूप से पूर्णांक के रूप में इसका ट्रैक रखें। सभी संचालन पूर्णांक पर किया जाना चाहिए। केवल प्रदर्शन के लिए दशमलव है।

check out this fiddle यदि आप पैसे का ट्रैक रखने के लिए दशमलव बिंदुओं का उपयोग करने के बारे में सोच रहे हैं।

+0

यहां अपडेट किया गया है: http://jsfiddle.net/PfPbt/15/ जहां आप अंतर और अनुशंसित समाधान देख सकते हैं। –

संबंधित मुद्दे