इस काम करने के लिए प्राप्त करने के लिए लगता है, तो संपादित करने के लिए स्वतंत्र महसूस, आपको पहले दशमलव को सामान्य बनाने के लिए है:
>>> x = decimal.Decimal ('10000000')
>>> x.normalize()
Decimal('1E+7')
>>> x.normalize().to_eng_string()
'10E+6'
इस का कारण यह स्रोत में जाने पर द्वारा की खोज की जा सकती है कोड।
आप अजगर 2.7.3 स्रोत पेड़ में to_eng_string()
(Lib/decimal.py
Gzipped स्रोत राल गेंद here से) की जांच करते हैं, तो यह बस सच करने के लिए eng
सेट के साथ __str__
कहता है।
फिर आप देख सकते हैं कि इसके साथ शुरू में कितने अंक दशमलव के बाईं ओर जाना पर फैसला:
leftdigits = self._exp + len(self._int)
निम्न तालिका पता चलता है कि मूल्यों को उन दो बातों के लिए कर रहे हैं:
._exp ._int len leftdigits
----- --------- --- ----------
Decimal (1000000) 0 '1000000' 7 7
Decimal ('1E+6') 6 '1' 1 7
कोड है कि उसके बाद भी जारी है:
if self._exp <= 0 and leftdigits > -6:
# no exponent required
dotplace = leftdigits
elif not eng:
# usual scientific notation: 1 digit on left of the point
dotplace = 1
elif self._int == '0':
# engineering notation, zero
dotplace = (leftdigits + 1) % 3 - 1
else:
# engineering notation, nonzero
dotplace = (leftdigits - 1) % 3 + 1
और आपको लगता है कि, Unle देख सकते हैं एसएस पहले से ही में एक निश्चित सीमा (self._exp > 0 or leftdigits <= -6
) में एक एक्सपोनेंट है, स्ट्रिंग प्रतिनिधित्व में इसे कोई भी नहीं दिया जाएगा।
आगे की जांच इस व्यवहार का कारण बताती है। कोड को स्वयं देखकर, आप देखेंगे कि यह General Decimal Arithmetic Specification
(पीडीएफ here) पर आधारित है।
"करने के लिए वैज्ञानिक-स्ट्रिंग" आपरेशन धर्मान्तरित:
आप to-scientific-string
(जिस पर to-engineering-string
भारी आधारित है) के लिए है कि दस्तावेज़ खोजते हैं, तो यह हिस्सा (दूसरे शब्दों में बयान, और मेरे बोल्ड बिट्स के साथ) में कहा गया है एक एक्सपोनेंट की आवश्यकता होने पर वैज्ञानिक नोटेशन का उपयोग करके स्ट्रिंग की संख्या। ऑपरेशन संदर्भ से प्रभावित नहीं है।
संख्या तो एक सीमित संख्या है:
गुणांक पहले एक स्ट्रिंग के लिए आधार दस में पात्रों 0 का उपयोग कर के माध्यम से 9 में कोई शून्य के साथ (यदि अपने मूल्य शून्य है सिवाय बदल जाती है, जिस स्थिति एक में एकल 0 वर्ण का उपयोग किया जाता है)।
इसके बाद, समायोजित प्रतिपादक गणना की जाती है; यह एक्सपोनेंट है, साथ ही परिवर्तित गुणांक में वर्णों की संख्या, कम एक है। वह है, एक्सपोनेंट + (क्लैथेंथ -1), जहां दशमलव अंक दशमलव में गुणांक की लंबाई है।
तो प्रतिपादक से कम या शून्य के बराबर है और समायोजित प्रतिपादक से अधिक या -6 के बराबर है, संख्या घातीय संकेतन का उपयोग किए बिना एक चरित्र रूप में परिवर्तित हो जाएगा। इस मामले में, यदि एक्सपोनेंट शून्य है तो कोई दशमलव बिंदु जोड़ा नहीं जाता है। अन्यथा (एक्सपोनेंट नकारात्मक होगा), एक दशमलव बिंदु दशमलव बिंदु के दाईं ओर वर्णों की संख्या निर्दिष्ट करने वाले एक्सपोनेंट के पूर्ण मूल्य के साथ डाला जाएगा। आवश्यक रूप से परिवर्तित गुणांक के बाईं ओर वर्ण "0" जोड़े गए हैं। यदि इस प्रविष्टि के बाद दशमलव बिंदु दशमलव बिंदु से पहले कोई चरित्र नहीं है तो एक पारंपरिक "0" वर्ण उपसर्ग किया गया है।
दूसरे शब्दों में, यह कर रहा है कि यह क्या कर रहा है क्योंकि मानक यह करने के लिए कहता है।
मैं यहाँ समाधान नहीं मिला "% .4g"% एक्स – lehalle