फ्लोटिंग पॉइंट नंबर गलत क्यों हैं?


198

फ़्लोटिंग पॉइंट नंबरों के रूप में संग्रहीत होने पर कुछ संख्या सटीकता क्यों खो देती है?

उदाहरण के लिए, दशमलव संख्या 9.2को दो दशमलव पूर्णांक ( 92/10) के अनुपात के रूप में बिल्कुल व्यक्त किया जा सकता है , दोनों को बाइनरी ( 0b1011100/0b1010) में बिल्कुल व्यक्त किया जा सकता है । हालाँकि, फ़्लोटिंग पॉइंट संख्या के रूप में संग्रहीत समान अनुपात कभी भी इसके बराबर नहीं होता है 9.2:

32-bit "single precision" float: 9.19999980926513671875
64-bit "double precision" float: 9.199999999999999289457264239899814128875732421875

64 बिट मेमोरी में व्यक्त करने के लिए इतनी स्पष्ट रूप से सरल संख्या "बहुत बड़ी" कैसे हो सकती है ?




जवाबों:


241

अधिकांश प्रोग्रामिंग भाषाओं में, फ़्लोटिंग पॉइंट नंबरों को वैज्ञानिक संकेतन की तरह दर्शाया जाता है : एक घातांक और एक मंटिसा (जिसे महत्व भी कहा जाता है)। एक बहुत ही सरल संख्या, कहते हैं 9.2, वास्तव में यह अंश है:

5179139571476070 * 2 -49

जहां प्रतिपादक है -49और मंटिसा है 5179139571476070। इस तरह से कुछ दशमलव संख्याओं का प्रतिनिधित्व करना असंभव है, यह है कि प्रतिपादक और मंटिसा दोनों पूर्णांक होना चाहिए। दूसरे शब्दों में, सब तैरता एक होना चाहिए पूर्णांक एक से गुणा 2 के पूर्णांक शक्ति

9.2बस हो सकता है 92/10, लेकिन 10 को 2 एन के रूप में व्यक्त नहीं किया जा सकता है यदि एन पूर्णांक मूल्यों तक सीमित है।


डेटा देखना

सबसे पहले, कुछ घटक 32-और 64-बिट बनाने वाले घटकों को देखने के लिए float। यदि आप केवल उत्पादन (पायथन में उदाहरण) की परवाह करते हैं, तो इन पर चमक डालें:

def float_to_bin_parts(number, bits=64):
    if bits == 32:          # single precision
        int_pack      = 'I'
        float_pack    = 'f'
        exponent_bits = 8
        mantissa_bits = 23
        exponent_bias = 127
    elif bits == 64:        # double precision. all python floats are this
        int_pack      = 'Q'
        float_pack    = 'd'
        exponent_bits = 11
        mantissa_bits = 52
        exponent_bias = 1023
    else:
        raise ValueError, 'bits argument must be 32 or 64'
    bin_iter = iter(bin(struct.unpack(int_pack, struct.pack(float_pack, number))[0])[2:].rjust(bits, '0'))
    return [''.join(islice(bin_iter, x)) for x in (1, exponent_bits, mantissa_bits)]

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

पायथन floatएक 64-बिट, डबल-सटीक संख्या है। सी, सी ++, जावा और सी # जैसी अन्य भाषाओं में, डबल-सटीक का एक अलग प्रकार है double, जिसे अक्सर 64 बिट्स के रूप में लागू किया जाता है।

जब हम अपने उदाहरण के साथ उस फ़ंक्शन को कॉल करते हैं 9.2, तो यहां हमें क्या मिलेगा:

>>> float_to_bin_parts(9.2)
['0', '10000000010', '0010011001100110011001100110011001100110011001100110']

डेटा की व्याख्या करना

आप देखेंगे कि मैंने रिटर्न वैल्यू को तीन घटकों में विभाजित किया है। ये घटक हैं:

  • संकेत
  • प्रतिपादक
  • मंटिसा (जिसे महत्वपूर्ण भी कहा जाता है, या अंश)

संकेत

संकेत पहले घटक में एकल बिट के रूप में संग्रहीत किया जाता है। यह व्याख्या करना आसान है: 0इसका मतलब है कि फ्लोट एक सकारात्मक संख्या है; 1इसका मतलब नकारात्मक है। क्योंकि 9.2सकारात्मक है, हमारा संकेत मूल्य है 0

प्रतिपादक

प्रतिपादक को मध्य घटक में 11 बिट्स के रूप में संग्रहीत किया जाता है। हमारे मामले में, 0b10000000010। दशमलव में, जो मान का प्रतिनिधित्व करता है 1026। इस घटक का एक उत्कर्ष यह है कि आपको सही घातांक प्राप्त करने के लिए 2 (# बिट्स) के बराबर संख्या को घटाना चाहिए - 1 - 1 ; हमारे मामले में, इसका मतलब है कि सही घातांक प्राप्त करने के लिए घटाना 0b1111111111(दशमलव संख्या 1023), 0b00000000011(दशमलव संख्या 3)।

अपूर्णांश

मंटिसा को तीसरे घटक में 52 बिट्स के रूप में संग्रहीत किया जाता है। हालाँकि, इस घटक के लिए एक क्विक भी है। इस विचित्रता को समझने के लिए, वैज्ञानिक संकेतन में एक संख्या पर विचार करें, जैसे:

6.0221413x10 23

मंटिसा होगा 6.0221413। याद रखें कि वैज्ञानिक संकेतन में मंटिसा हमेशा एक एकल शून्य अंक से शुरू होती है। बाइनरी के लिए एक ही सही है, सिवाय इसके कि बाइनरी केवल दो अंक हैं: 0और 1। तो बाइनरी मंटिसा हमेशा से शुरू होता है 1! जब एक फ्लोट संग्रहीत होता है, 1तो बाइनरी मंटिसा के सामने अंतरिक्ष को बचाने के लिए छोड़ दिया जाता है; हमें इसे सही मन्तिसा प्राप्त करने के लिए अपने तीसरे तत्व के सामने रखना होगा :

1,0010011001100110011001100110011001100110011001100110

इसमें केवल एक साधारण जोड़ शामिल है, क्योंकि हमारे तीसरे घटक में संग्रहीत बिट्स वास्तव में मंटिसा के आंशिक भाग का प्रतिनिधित्व करते हैं , मूलांक के दाईं ओर ।

दशमलव संख्या के साथ काम करते समय, हम 10. की शक्तियों को गुणा या विभाजित करके "दशमलव बिंदु को स्थानांतरित करते हैं"। द्विआधारी में, हम 2 की शक्तियों को गुणा या विभाजित करके एक ही काम कर सकते हैं। चूंकि हमारे तीसरे तत्व में 52 बिट्स हैं, इसलिए हम विभाजित करते हैं यह द्वारा 2 52 इसे स्थानांतरित करने के सही करने के लिए 52 स्थानों:

0,0010011001100110011001100110011001100110011001100110

दशमलव संकेतन में, कि विभाजित के रूप में ही है 675539944105574के द्वारा 4503599627370496प्राप्त करने के लिए 0.1499999999999999। (यह एक अनुपात का एक उदाहरण है जिसे बाइनरी में बिल्कुल व्यक्त किया जा सकता है, लेकिन केवल दशमलव में लगभग; अधिक विस्तार के लिए, देखें: 675539944105574/4503599627370496 ।)

अब जब हमने तीसरे घटक को एक भिन्नात्मक संख्या में बदल दिया है, तो 1यह सही मंटिसा देता है।

अवयवों का पुनरावर्तन

  • हस्ताक्षर (पहला घटक): 0सकारात्मक के लिए, 1नकारात्मक के लिए
  • घातांक (मध्य घटक): सही घातांक प्राप्त करने के लिए 2 (# बिट्स) - 1 - 1 को घटाएं
  • मंटिसा (अंतिम घटक): 2 (# बिट्स) से विभाजित करें और 1सही मंटिसा पाने के लिए जोड़ें

संख्या की गणना

सभी तीन भागों को एक साथ रखकर, हमें यह बाइनरी नंबर दिया गया है:

1.0010011001100110011001100110011001100110011001100110 x 10 11

जिसे हम बाइनरी से दशमलव में बदल सकते हैं:

1.1499999999999999 x 2 3 ( अनुभवहीन !)

और 9.2एक अस्थायी बिंदु मान के रूप में संग्रहीत होने के बाद हमने ( ) के साथ शुरू की गई संख्या के अंतिम प्रतिनिधित्व को गुणा करने के लिए :

9.1999999999999993


एक अंश के रूप में प्रतिनिधित्व करना

9.2

अब जब हमने संख्या बना ली है, तो इसे एक साधारण अंश में समेटना संभव है:

1.0010011001100110011001100110011001100110011001100110 x 10 11

मंटिसा को पूरी संख्या में शिफ्ट करें:

10010011001100110011001100110011001100110011001100001001 10 x 11-110100

दशमलव में परिवर्तित करें:

5179139571476070 x 2 3-52

घातांक घटाना:

5179139571476070 x 2 -49

नकारात्मक घातांक को विभाजन में बदलें:

5179139571476070/2 49

गुणा विस्तारक:

5179139571476070/562949953421312

जो बराबर है:

9.1999999999999993

9.5

>>> float_to_bin_parts(9.5)
['0', '10000000010', '0011000000000000000000000000000000000000000000000000']

पहले से ही आप देख सकते हैं कि मंटिसा केवल 4 अंक है और इसके बाद पूरे शून्य हैं। लेकिन चलो पेस के माध्यम से चलते हैं।

बाइनरी वैज्ञानिक संकेतन इकट्ठा करें:

1.0011 x 10 11

दशमलव बिंदु को शिफ्ट करें:

10011 x 10 11-100

घातांक घटाना:

10011 x 10 -1

बाइनरी टू दशमलव:

19 x 2 -1

विभाजन के लिए नकारात्मक घातांक:

१ ९ / २

गुणा विस्तारक:

19/2

बराबर है:

9.5



आगे की पढाई


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

1
यदि आप पायथन और फ्लोटिंग-पॉइंट के बारे में बात कर रहे हैं, तो मैं आपके लिंक में कम से कम पायथन ट्यूटोरियल को शामिल करने का सुझाव दूंगा : docs.python.org/3.4/tutorial/floatingpoint.html यह एक स्टॉप गो-टू माना जाता है पायथन प्रोग्रामर के लिए फ्लोटिंग-पॉइंट मुद्दों के लिए संसाधन। यदि इसकी किसी तरह से कमी है (और यह लगभग निश्चित रूप से है), तो कृपया अपडेट या परिवर्तन के लिए पायथन बग ट्रैकर पर एक समस्या खोलें।
मार्क डिकिंसन

@ एम्हैस्टर यदि यह सामुदायिक विकि में बदल जाता है, तो बेझिझक मेरे उत्तर को आप में शामिल करें।
निकु स्टियुरका

5
यह उत्तर निश्चित रूप से अस्थायी-point-gui.de से भी जुड़ा होना चाहिए , क्योंकि यह शुरुआती लोगों के लिए संभवतः सबसे अच्छा परिचय है। IMO, इसे ऊपर भी जाना चाहिए "हर कंप्यूटर वैज्ञानिक को क्या पता होना चाहिए ..." - इन दिनों, लोग जो गोल्डबर्ग के कागज को यथोचित रूप से समझ सकते हैं, वे पहले से ही इसके बारे में अच्छी तरह से जानते हैं।
डैनियल प्राइडेन

1
"यह उस अनुपात का एक उदाहरण है जिसे बाइनरी में बिल्कुल व्यक्त किया जा सकता है, लेकिन केवल दशमलव में लगभग"। यह सच नहीं है। ये सभी 'दो की शक्ति पर संख्या' अनुपात दशमलव में सटीक हैं। कोई भी अनुमान केवल दशमलव संख्या को छोटा करने के लिए है - सुविधा के लिए।
रिक रेगन

29

यह एक पूर्ण उत्तर नहीं है ( mhlester पहले से ही बहुत अच्छी जमीन को कवर किया है जिसकी मैं नकल नहीं करूंगा), लेकिन मैं यह तनाव देना चाहूंगा कि किसी संख्या का प्रतिनिधित्व उस आधार पर निर्भर करता है जिसमें आप काम कर रहे हैं।

अंश 2/3 पर विचार करें

अच्छे-राजभाषा 'आधार 10' में, हम आम तौर पर इसे कुछ इस तरह लिखते हैं

  • 0.666 ...
  • 0.666
  • 0.667

जब हम उन अभ्यावेदन को देखते हैं, तो हम उनमें से प्रत्येक को 2/3 अंश के साथ जोड़ते हैं, भले ही केवल पहला प्रतिनिधित्व गणितीय रूप से अंश के बराबर हो। दूसरी और तीसरी अभ्यावेदन / सन्निकटन में 0.001 के आदेश पर एक त्रुटि है, जो वास्तव में 9.2 और 9.19999999999993 के बीच त्रुटि से बहुत खराब है। वास्तव में, दूसरा प्रतिनिधित्व भी सही ढंग से गोल नहीं है! फिर भी, हमें नंबर 2/3 के सन्निकटन के रूप में 0.666 के साथ कोई समस्या नहीं है, इसलिए हमें वास्तव में समस्या नहीं होनी चाहिए कि अधिकांश कार्यक्रमों में 9.2 कैसे निहित है(हां, कुछ कार्यक्रमों में यह मायने रखता है।)

संख्या आधार

तो यहाँ जहाँ संख्या आधार crutial हैं। यदि हम बेस 3 में 2/3 का प्रतिनिधित्व करने की कोशिश कर रहे थे, तो

(२/३) १० = ०.२

दूसरे शब्दों में, हमारे पास आधारों को स्विच करके एक ही संख्या के लिए एक सटीक, परिमित प्रतिनिधित्व है! टेक-दूर यह है कि भले ही आप किसी भी संख्या को किसी भी आधार में बदल सकते हैं, सभी तर्कसंगत संख्याओं में कुछ आधारों में सटीक परिमित प्रतिनिधित्व है, लेकिन अन्य में नहीं

इस बिंदु को घर पर चलाने के लिए, आइए 1/2 देखें। यह आपको आश्चर्यचकित कर सकता है कि भले ही इस पूरी तरह से सरल संख्या का आधार 10 और 2 में एक सटीक प्रतिनिधित्व है, लेकिन इसके लिए आधार 3 में दोहराए जाने वाले प्रतिनिधित्व की आवश्यकता होती है।

(1/2) 10 = 0.5 10 = 0.1 2 = 0.1111 ... 3

फ्लोटिंग पॉइंट नंबर गलत क्यों हैं?

क्योंकि अक्सर-बार, वे तर्कसंगत अनुमान लगाते हैं जिन्हें आधार 2 (अंकों की पुनरावृत्ति) में सूक्ष्मता से प्रतिनिधित्व नहीं किया जा सकता है, और सामान्य रूप से वे वास्तविक (संभवतः तर्कहीन) संख्याओं का अनुमान लगा रहे हैं जो किसी भी आधार में बहुत से अंकों में प्रतिनिधित्व नहीं कर सकते हैं ।


3
तो दूसरे शब्दों में, बेस -3 के लिए एकदम सही होगा 1/3क्योंकि बेस -10 के लिए एकदम सही है 1/10बेस -2
mLester

2
@ मेहस्टर हां। और सामान्य तौर पर, आधार-एन किसी भी अंश के लिए एकदम सही है जिसका हर Nया उसके कई गुण है।
निकु स्तिर्का

2
और यह एक कारण है कि कुछ संख्यात्मक उपकरण बॉक्स "क्या द्वारा विभाजित किया गया था" का ट्रैक रखते हैं, और इस प्रक्रिया में सभी तर्कसंगत संख्याओं के लिए "अनंत सटीकता" रख सकते हैं। भौतिकविदों की तरह अपने समीकरणों को अंतिम संभव क्षण तक प्रतीकात्मक रखना पसंद करते हैं, जबकि πआदि के कारक रद्द हो जाते हैं।
फ्लोरिस

3
@ फ़्लोरिस मैंने ऐसे मामलों को भी देखा है जहां एक एल्गोरिथ्म जो केवल बुनियादी अंकगणित (यानी इनपुट की तर्कसंगतता को संरक्षित करता है) करता है, यह निर्धारित करता है कि क्या इनपुट (संभावना) तर्कसंगत था, सामान्य फ्लोटिंग अंक अंकगणितीय का उपयोग करके गणित का प्रदर्शन करें, फिर तर्कसंगत का अनुमान लगाएं। किसी भी गोलाई की त्रुटियों को ठीक करने के लिए अंत में सन्निकटन। विशेष रूप से मैटलैब की कम रो इकोलोन फॉर्म एल्गोरिथ्म ऐसा करता है, और यह संख्यात्मक स्थिरता की जबरदस्त मदद करता है।
निकु स्तिर्का

@SchighSchagh - दिलचस्प, मुझे नहीं पता था कि। मुझे पता है कि संख्यात्मक स्थिरता एक ऐसी चीज है, जो इन दिनों डबल डबल परिशुद्धता के लिए पर्याप्त रूप से नहीं सिखाई जाती है। जिसका अर्थ है कि कई सुंदर एल्गोरिदम की लालित्य के बारे में सीखने की बहुत याद आती है। मुझे वास्तव में एल्गोरिदम पसंद हैं जो अपनी त्रुटियों को गणना और सही करते हैं।
फ्लोरिस

13

हालांकि अन्य सभी उत्तर अच्छे हैं, फिर भी एक चीज गायब है:

यह अपरिमेय संख्याओं का प्रतिनिधित्व करने के लिए असंभव है (उदाहरण के लिए π, sqrt(2), log(3)ठीक, आदि)!

और वास्तव में यही कारण है कि उन्हें तर्कहीन कहा जाता है। दुनिया में बिट स्टोरेज की कोई राशि उनमें से एक को भी रखने के लिए पर्याप्त नहीं होगी। केवल प्रतीकात्मक अंकगणित उनकी सटीकता को संरक्षित करने में सक्षम है।

यद्यपि यदि आप अपने गणित को तर्कसंगत संख्याओं तक सीमित रखना चाहते हैं तो केवल परिशुद्धता की समस्या प्रबंधन योग्य हो जाती है। आपको (संभवतः बहुत बड़े) पूर्णांक की एक जोड़ी को संग्रहीत करने aऔर bअंश द्वारा दर्शाए गए संख्या को धारण करने की आवश्यकता होगी a/b। आपके सभी अंकगणित को हाईस्कूल गणित (जैसे a/b * c/d = ac/bd) के अंशों पर करना होगा ।

लेकिन निश्चित रूप से आप अभी भी जब मुसीबत उसी तरह में चलाने होगा pi, sqrt, log, sin, आदि शामिल हैं।

टी एल; डॉ

हार्डवेयर त्वरित अंकगणित के लिए केवल परिमेय संख्याओं की एक सीमित मात्रा का प्रतिनिधित्व किया जा सकता है। प्रत्येक नहीं-प्रतिनिधित्व योग्य संख्या अनुमानित है। कुछ संख्याओं (यानी अपरिमेय) को कभी भी प्रणाली के बिना प्रतिनिधित्व नहीं किया जा सकता है।


4
दिलचस्प है, तर्कहीन आधार मौजूद हैं। उदाहरण के लिए Phinary
विड्राक

5
अपरिमेय संख्या (केवल) उनके आधार में दर्शाई जा सकती है। उदाहरण के लिए पीआई बेस पी में 10 है
फुल्विक

4
बिंदु वैध रहता है: कुछ संख्याओं का प्रतिनिधित्व कभी नहीं किया जा सकता है चाहे कोई भी प्रणाली हो। आप अपना आधार बदलकर कुछ हासिल नहीं कर सकते क्योंकि तब कुछ अन्य नंबरों का प्रतिनिधित्व नहीं किया जा सकता है।
लम्पेन

4

असीम रूप से कई वास्तविक संख्याएं हैं (इतने सारे कि आप उन्हें गणना नहीं कर सकते हैं), और असीम रूप से कई तर्कसंगत संख्याएं हैं (इनकी गणना करना संभव है)।

फ्लोटिंग-पॉइंट प्रतिनिधित्व एक परिमित एक (कंप्यूटर में किसी भी चीज़ की तरह) है, इसलिए अपरिहार्य रूप से कई कई संख्याओं का प्रतिनिधित्व करना असंभव है। विशेष रूप से, 64 बिट्स केवल आपको केवल 18,446,744,073,709,551,616 विभिन्न मूल्यों (जो कि अनंत की तुलना में कुछ भी नहीं है) के बीच अंतर करने की अनुमति देते हैं। मानक सम्मेलन के साथ, 9.2 उनमें से एक नहीं है। कुछ पूर्णांक m और e के लिए जो फॉर्म m.2 ^ e के हो सकते हैं।


आप एक अलग संख्या प्रणाली के साथ आ सकते हैं, उदाहरण के लिए 10, जहां 9.2 का सटीक प्रतिनिधित्व होगा। लेकिन अन्य संख्याएं, 1/3 कहती हैं, फिर भी प्रतिनिधित्व करना असंभव होगा।


यह भी ध्यान दें कि डबल-सटीक फ़्लोटिंग-पॉइंट नंबर बेहद सटीक हैं। वे किसी भी संख्या को 15 से अधिक सटीक अंकों के साथ बहुत विस्तृत रेंज में दर्शा सकते हैं। दैनिक जीवन संगणना के लिए, 4 या 5 अंक पर्याप्त से अधिक हैं। आपको वास्तव में उन 15 की कभी आवश्यकता नहीं होगी, जब तक आप अपने जीवनकाल के हर मिलीसेकंड को गिनना नहीं चाहते।


1

हम बाइनरी फ़्लोटिंग पॉइंट में 9.2 का प्रतिनिधित्व क्यों नहीं कर सकते हैं?

फ़्लोटिंग पॉइंट नंबर (थोड़ा सा सरलीकृत करना) एक पॉज़िटिव नंबरिंग सिस्टम है जिसमें एक सीमित संख्या में अंक और एक मूलांक मूलांक बिंदु होता है।

यदि विभाजक के प्रमुख कारक (जब अंश को सबसे कम शब्दों में व्यक्त किया जाता है) आधार के कारक हैं, तो एक अंश को एक स्थितीय संख्या प्रणाली में अंकों की एक सीमित संख्या का उपयोग करके बिल्कुल व्यक्त किया जा सकता है।

10 के मुख्य कारक 5 और 2 हैं, इसलिए आधार 10 में हम फॉर्म a (2 b 5 c ) के किसी भी अंश का प्रतिनिधित्व कर सकते हैं ।

दूसरी ओर 2 का केवल प्रधानमंत्री कारक, 2 है, तो आधार 2 में हम केवल प्रपत्र एक के भिन्न प्रतिनिधित्व कर सकते हैं / (2 )

कंप्यूटर इस प्रतिनिधित्व का उपयोग क्यों करते हैं?

क्योंकि यह काम करने के लिए एक सरल प्रारूप है और यह अधिकांश उद्देश्यों के लिए पर्याप्त रूप से सटीक है। मूल रूप से एक ही कारण के लिए वैज्ञानिक "वैज्ञानिक संकेतन" का उपयोग करते हैं और अपने परिणामों को प्रत्येक चरण में उचित संख्या में गोल करते हैं।

यह एक निश्चित प्रारूप को परिभाषित करना संभव होगा, उदाहरण के लिए (32 उदाहरण के लिए) और 32-बिट भाजक के साथ। यह उन संख्याओं का प्रतिनिधित्व करने में सक्षम होगा जो IEEE डबल सटीक फ़्लोटिंग पॉइंट नहीं कर सकता था, लेकिन समान रूप से ऐसे कई नंबर होंगे जिन्हें डबल प्रीसेशन फ़्लोटिंग पॉइंट में दर्शाया जा सकता है जो कि ऐसे निश्चित-आकार के भिन्न स्वरूप में प्रतिनिधित्व नहीं किया जा सकता है।

हालांकि बड़ी समस्या यह है कि इस तरह के प्रारूप पर गणना करने के लिए एक दर्द है। दो कारणों से।

  1. यदि आप प्रत्येक संख्या का ठीक एक प्रतिनिधित्व करना चाहते हैं, तो प्रत्येक गणना के बाद आपको अंश को सबसे कम शब्दों में कम करना होगा। इसका मतलब है कि प्रत्येक ऑपरेशन के लिए आपको मूल रूप से सबसे बड़ी सामान्य विभाजक गणना करने की आवश्यकता होती है।
  2. यदि आपकी गणना के बाद आप एक अप्राप्य परिणाम के साथ समाप्त हो जाते हैं क्योंकि अंश या हर के लिए आपको निकटतम प्रतिनिधित्व योग्य परिणाम खोजने की आवश्यकता होती है। यह गैर-तुच्छ है।

कुछ भाषाएं भिन्न प्रकार की पेशकश करती हैं, लेकिन आमतौर पर वे इसे मध्यस्थता परिशुद्धता के साथ संयोजन में करते हैं, इससे अंदाजा लगाया जा सकता है कि उन्हें भिन्न होने की चिंता है लेकिन यह स्वयं की समस्या है, जब कोई संख्या बड़ी संख्या में गणना से गुजरती है, तो हर का आकार बढ़ता है। इसलिए अंश के लिए आवश्यक संग्रहण फट सकता है।

कुछ भाषाएं दशमलव फ़्लोटिंग पॉइंट प्रकार भी प्रदान करती हैं, ये मुख्य रूप से उन परिदृश्यों में उपयोग किए जाते हैं जहां यह महत्वपूर्ण है कि कंप्यूटर को पहले से मौजूद गोलाई नियमों से मेल खाता है जो कि मानव (मुख्य रूप से वित्तीय गणना) के साथ लिखे गए थे। बाइनरी फ़्लोटिंग पॉइंट की तुलना में ये काम करना थोड़ा अधिक कठिन है, लेकिन सबसे बड़ी समस्या यह है कि अधिकांश कंप्यूटर उनके लिए हार्डवेयर समर्थन प्रदान नहीं करते हैं।


-4

इसे इस्तेमाल करे

DecimalFormat decimalFormat = new DecimalFormat("#.##");
String.valueOf(decimalFormat.format(decimalValue))));

decimalValueपरिवर्तित करने के लिए ' ' आपका मूल्य है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.