第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

為什么repr(float)在Google App Engine上返回的位數(shù)要比其他數(shù)字多

為什么repr(float)在Google App Engine上返回的位數(shù)要比其他數(shù)字多

慕運(yùn)維8079593 2021-05-05 18:42:03
我有一些簡(jiǎn)單的代碼,如下所示a = 0.8889print repr(a)print str(a)我在幾種不同的系統(tǒng)(包括python 2.7.12?2.7.14,作為提示輸入或腳本)上進(jìn)行了嘗試,總是得到如下結(jié)果0.88890.8889這是一個(gè)例子。但是,在App Engine(運(yùn)行時(shí)Python 2.7.12)上,我得到了0.888900000000000020.8889我知道repr()趨勢(shì)會(huì)更加精確。問題是為什么App Engine的行為會(huì)有所不同。它是否依賴底層硬件?背景:這個(gè)事實(shí)讓我很煩,因?yàn)樵趯⒏↑c(diǎn)數(shù)轉(zhuǎn)換為json時(shí),我不必要地放寬了位數(shù)。更新:原來這是GAE運(yùn)行時(shí)的錯(cuò)誤。正如Mark所評(píng)論的,根本原因是未配置sys.float_repr_style。GAE支持團(tuán)隊(duì)在此處創(chuàng)建了錯(cuò)誤報(bào)告。Update2: 它已于2018/08/19修復(fù)。即使尚未宣布。
查看完整描述

2 回答

?
慕容3067478

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í)將尾隨零分隔為零)


查看完整回答
反對(duì) 回復(fù) 2021-05-25
?
Qyouu

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中提供的表示非常精確。


查看完整回答
反對(duì) 回復(fù) 2021-05-25
  • 2 回答
  • 0 關(guān)注
  • 162 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)