इसी तरह के कई सवालों के जवाब देखने के बाद, यह मेरे लिए सबसे अच्छा समाधान है:
def floatToString(inputValue):
return ('%.15f' % inputValue).rstrip('0').rstrip('.')
मेरा तर्क:
%g
वैज्ञानिक संकेतन से छुटकारा नहीं मिलता है।
>>> '%g' % 0.000035
'3.5e-05'
15 दशमलव स्थान अजीब व्यवहार से बचने के लिए लगता है और मेरी आवश्यकताओं के लिए बहुत सटीक है।
>>> ('%.15f' % 1.35).rstrip('0').rstrip('.')
'1.35'
>>> ('%.16f' % 1.35).rstrip('0').rstrip('.')
'1.3500000000000001'
मैं format(inputValue, '.15f').
इसके बजाय इस्तेमाल कर सकता था '%.15f' % inputValue
, लेकिन यह थोड़ा धीमा (~ 30%) है।
मैं इस्तेमाल कर सकता था Decimal(inputValue).normalize()
, लेकिन इसके साथ ही कुछ मुद्दे भी हैं। एक के लिए, यह एक बहुत धीमी (~ 11x) है। मैंने यह भी पाया कि हालाँकि इसमें बहुत बढ़िया परिशुद्धता है, फिर भी यह उपयोग करते समय सटीक नुकसान से ग्रस्त है normalize()
।
>>> Decimal('0.21000000000000000000000000006').normalize()
Decimal('0.2100000000000000000000000001')
>>> Decimal('0.21000000000000000000000000006')
Decimal('0.21000000000000000000000000006')
सबसे महत्वपूर्ण बात, मैं अभी भी Decimal
एक से परिवर्तित float
कर रहा हूँ जिससे आप उस संख्या के अलावा किसी अन्य चीज़ के साथ समाप्त हो सकते हैं जो आप वहाँ डालते हैं। मुझे लगता है कि Decimal
जब अंकगणित अंदर रहता है Decimal
और Decimal
एक स्ट्रिंग के साथ आरम्भ किया जाता है, तो यह सबसे अच्छा काम करता है ।
>>> Decimal(1.35)
Decimal('1.350000000000000088817841970012523233890533447265625')
>>> Decimal('1.35')
Decimal('1.35')
मुझे यकीन है कि Decimal.normalize()
संदर्भ सेटिंग्स का उपयोग करके जो आवश्यक है उसे सटीक मुद्दा समायोजित किया जा सकता है, लेकिन पहले से ही धीमी गति को देखते हुए और हास्यास्पद परिशुद्धता और इस तथ्य की आवश्यकता नहीं है कि मैं अभी भी एक फ्लोट से परिवर्तित हो रहा हूं और वैसे भी सटीक खो जाएगा, मैंने नहीं किया लगता है कि यह पीछा करने लायक था।
मैं सम्भव नहीं हूँ "-0" के परिणाम से क्योंकि -0.0 एक मान्य फ़्लोटिंग पॉइंट नंबर है और यह शायद वैसे भी एक दुर्लभ घटना होगी, लेकिन जब से आपने उल्लेख किया है कि आप स्ट्रिंग परिणाम को यथासंभव कम रखना चाहते हैं, आप हमेशा बहुत कम अतिरिक्त गति लागत पर एक अतिरिक्त सशर्त का उपयोग कर सकता है।
def floatToString(inputValue):
result = ('%.15f' % inputValue).rstrip('0').rstrip('.')
return '0' if result == '-0' else result
3.14 == 3.140
- वे एक ही फ्लोटिंग पॉइंट नंबर हैं। उस मामले के लिए 3.140000 एक ही फ्लोटिंग-पॉइंट नंबर है। शून्य पहले स्थान पर मौजूद नहीं है।