why does JavaScript mess up 0.1 + 0.2 when C++ doesn't? -


इस सवाल का पहले से ही एक उत्तर है: < / P>

  • 30 उत्तरों

मैं समझता हूं कि आईईईई डबल के लिए प्रतिनिधित्व (या कोई भी बाइनरी प्रस्तुति) कोई <बिट> बीमित की सीमा के साथ 0.1 का प्रतिनिधित्व नहीं कर सकता।

मेरे पास इसके दो प्रश्न हैं मन:

  1. जब सी ++ भी डबल के लिए समान मानक का उपयोग करता है तो यह गड़बड़ क्यों नहीं करता 0.1 + 0.2 जैसा जावास्क्रिप्ट करता है? < / Li>
  2. जावास्क्रिप्ट को console.log (0.1) सही ढंग से प्रिंट करता है, जब उसे सही ढंग से स्मृति में नहीं रखा जा सकता है?

अस्थायी बिंदु सुन्न के रूपांतरण के लिए कम से कम तीन उचित विकल्प हैं तार करने के लिए:

  1. सटीक मान प्रिंट करें। यह एक स्पष्ट पसंद की तरह लगता है, लेकिन downsides है परिमित फ़्लोटिंग बिंदु संख्या का सही दशमलव मान हमेशा मौजूद है, लेकिन सैकड़ों महत्वपूर्ण अंक हो सकते हैं, जिनमें से अधिकांश का कोई व्यावहारिक उपयोग नहीं है। Java.util.BigDecimal के toString ऐसा करता है।
  2. फ़्लोटिंग प्वाइंट नंबर को विशिष्ट रूप से पहचानने के लिए पर्याप्त अंक प्रिंट करें। उदाहरण के लिए, जावा में डबल या फ्लोट के डिफ़ॉल्ट रूपांतरण के लिए बनाया गया विकल्प है।
  3. यह सुनिश्चित करने के लिए कुछ पर्याप्त अंक प्रिंट करें कि अधिकांश आउटपुट अंक को सबसे सरल गणनाओं में गोल त्रुटि से अप्रभावित किया जाएगा। यह सी में बनाया गया पसंद था।

इनमें से प्रत्येक के फायदे और नुकसान हैं 0.1 और 0.2 को जोड़ने के परिणाम के लिए एक विकल्प 3 रूपांतरण "0.3", "सही" जवाब मिलेगा। दूसरी तरफ, इस तरह से मुद्रित मूल्य में पढ़ना मूल फ्लोट को पुनर्प्राप्त करने के लिए पर निर्भर नहीं किया जा सकता है, क्योंकि कई फ़्लोटिंग प्वाइंट मान एक ही स्ट्रिंग के लिए मैप करते हैं।

मुझे नहीं लगता है कि इनमें से कोई विकल्प नहीं है "सही या गलत"। भाषा में आमतौर पर गैर-डिफ़ॉल्ट विकल्पों में से एक को मजबूर करने के तरीके होते हैं, और यह तब किया जाना चाहिए यदि डिफ़ॉल्ट किसी विशेष आउटपुट के लिए सबसे अच्छा विकल्प नहीं है।


Comments

Popular posts from this blog

c++ - C/pp Sockets, recv()/send() works only under gdb -

GO: Serve static pages -

objective c - How to open front/back camera at the same time in iOS developing? -