सीधे सवाल का जवाब देने के लिए, यहां आर फ़ंक्शन से नामकरण का उपयोग करके मेरा संस्करण है :
import math
def signif(x, digits=6):
if x == 0 or not math.isfinite(x):
return x
digits -= math.ceil(math.log10(abs(x)))
return round(x, digits)
इस उत्तर को पोस्ट करने का मेरा मुख्य कारण शिकायत करने वाली टिप्पणियां हैं जो "0.075" राउंड 0.08 के बजाय 0.07 हैं। यह कारण है, जैसा कि "नोविस सी" द्वारा इंगित किया गया है, फ्लोटिंग पॉइंट अंकगणित के संयोजन के लिए दोनों परिमित परिशुद्धता और बेस -2 प्रतिनिधित्व है । निकटतम संख्या 0.075 जिसे वास्तव में दर्शाया जा सकता है, थोड़ा छोटा है, इसलिए आपके द्वारा भोलेपन की अपेक्षा से गोलाई अलग तरह से निकलती है।
यह भी ध्यान दें कि यह गैर-दशमलव फ़्लोटिंग पॉइंट अंकगणित के किसी भी उपयोग पर लागू होता है, जैसे सी और जावा दोनों में एक ही मुद्दा है।
अधिक विस्तार से दिखाने के लिए, हम पायथन को "हेक्स" प्रारूप में संख्या को प्रारूपित करने के लिए कहते हैं:
0.075.hex()
जो हमें देता है 0x1.3333333333333p-4
:। ऐसा करने का कारण यह है कि सामान्य दशमलव प्रतिनिधित्व में अक्सर गोलाई शामिल होती है और इसलिए यह नहीं है कि कंप्यूटर वास्तव में संख्या को "कैसे" देखता है। यदि आप इस प्रारूप में उपयोग नहीं किए जाते हैं, तो कुछ उपयोगी संदर्भ पायथन डॉक्स और सी मानक हैं ।
यह दिखाने के लिए कि ये संख्याएँ किस तरह से काम करती हैं, हम अपने शुरुआती बिंदु पर वापस आ सकते हैं:
0x13333333333333 / 16**13 * 2**-4
जिसे छापना चाहिए 0.075
। 16**13
दशमलव बिंदु के बाद 13 हेक्साडेसिमल अंक हैं, और 2**-4
हेक्स घातांक बेस -2 हैं क्योंकि इसलिए है।
अब हमारे पास कुछ विचार है कि कैसे झंडे का प्रतिनिधित्व किया जाता है हम इसका उपयोग कर सकते हैं decimal
मॉड्यूल का हमें कुछ और सटीक दे , हमें दिखा सकते हैं कि क्या चल रहा है:
from decimal import Decimal
Decimal(0x13333333333333) / 16**13 / 2**4
दे रहा है: 0.07499999999999999722444243844
और उम्मीद है कि क्यों round(0.075, 2)
मूल्यांकन करने के लिए समझा रहा है0.07