2 回答

TA貢獻(xiàn)1773條經(jīng)驗(yàn) 獲得超3個(gè)贊
值的sys.float_repr_style
值為“舊版”,這是GAE在構(gòu)建時(shí)設(shè)置的選項(xiàng),無法更改。
此版本的repr
算法以前是Python 2.7之前使用的格式,該格式先計(jì)算17個(gè)有效數(shù)字,然后將輸出基于這17個(gè)數(shù)字(適當(dāng)時(shí)將尾隨零分隔為零)

TA貢獻(xiàn)1786條經(jīng)驗(yàn) 獲得超11個(gè)贊
顯然,正如@abarnert在評(píng)論中提到的那樣,GAE env在后臺(tái)做了一些工作,其中之一是提高了所使用的浮點(diǎn)數(shù)的精度。
您可以注意到的第一件事是:
>>> a = 0.88890000000000002
>>> print a
0.8889
這意味著多余的數(shù)字是無用的。
您可以使用Decimal模塊來重現(xiàn)這種情況:
>>> from decimal import *
>>> Context(prec=17).create_decimal_from_float(0.899).__str__()
'0.89900000000000002'
有趣的是,GAE似乎試圖模擬約17的浮點(diǎn)精度(float沒有特定的十進(jìn)制精度,因?yàn)樗鼈儽硎緸楦↑c(diǎn)數(shù))。如果> 17,則會(huì)得到更多的小數(shù),如果少于,則數(shù)字不夠精確。
使用的優(yōu)點(diǎn)Decimal是浮點(diǎn)錯(cuò)誤更少,盡管看起來repr()有一些問題。
查看以下更多擴(kuò)展示例以提供更多上下文:
>>> from decimal import *
>>> Context(prec=16).create_decimal_from_float(0.899).__str__()
'0.8990000000000000'
>>> Context(prec=17).create_decimal_from_float(0.899).__str__()
'0.89900000000000002'
>>> Context(prec=18).create_decimal_from_float(0.899).__str__()
'0.899000000000000021'
>>> repr(float(1.0000000000000003)).__str__()
'1.0000000000000002'
>>> Context(prec=17).create_decimal_from_float(1.0000000000000003).__str__()
'1.0000000000000002'
>>> repr(float(1.0000000000000002)).__str__()
'1.0000000000000002'
>>> Context(prec=17).create_decimal_from_float(1.0000000000000002).__str__()
'1.0000000000000002'
>>> repr(float(1.0000000000000001)).__str__()
'1.0'
>>> Context(prec=17).create_decimal_from_float(1.0000000000000001).__str__()
'1'
最后,由python float 0.899表示的實(shí)際數(shù)字是:
>>> from decimal import *
>>> Decimal(float(0.899))
Decimal('0.89900000000000002131628207280300557613372802734375')
因此,最后,reprGAE中提供的表示非常精確。
添加回答
舉報(bào)