1 回答

TA貢獻(xiàn)1828條經(jīng)驗(yàn) 獲得超6個(gè)贊
您的斷言是錯(cuò)誤的:不能用或369.1368
精確表示。?float32
?float64
最接近的float32
值是(大約)369.136810302734375
,它四舍五入到369.13681
您的額外數(shù)字的來(lái)源。最接近的float64
值是(大約)369.13679999999999382
,它更適合您的目的。
(當(dāng)然,如果您將其中任何一個(gè)四舍五入到小數(shù)點(diǎn)后四位數(shù)字,您就會(huì)得到您期望的數(shù)字。)
表示Decimal
是精確的:沒(méi)有舍入誤差。
JSON 傳輸和接收以十進(jìn)制表示的浮點(diǎn)值,但實(shí)際實(shí)現(xiàn)以各種語(yǔ)言表示,然后以不同的方式對(duì)這些數(shù)字進(jìn)行編碼。根據(jù)您通過(guò) JSON 通信的實(shí)體類型,通過(guò)編碼和解碼Decimal
可以完全按照您的意愿保留數(shù)字,但請(qǐng)注意,用 C++ 或 Python 編寫(xiě)的程序可能會(huì)將您的數(shù)字解碼為不同的浮點(diǎn)數(shù)-點(diǎn)精度并引入各種舍入誤差。
此 Go Playground 示例使用新添加的%x
格式,并向您展示數(shù)字如何在內(nèi)部存儲(chǔ):
作為 float32 = 369.13681030273437500 (float32),這實(shí)際上是 12095875p-15 或 0x1.712306p+08
和:
作為 float64 = 369.136799999999999382 (float64),實(shí)際上是 6493923261440380p-44 或 0x1.712305532617cp+08
也就是說(shuō),數(shù)字 369。無(wú)論內(nèi)部以二進(jìn)制表示。它在 2?8?= 256 和 2?9?= 512 之間。在二進(jìn)制中,它是 1 256、無(wú) 128、1 64、1 32、1 16、無(wú) 8、無(wú) 4、無(wú) 2 和 1 1:1.01110001 某物x?2?8。格式%b
以一種方式表達(dá)%x
,另一種格式以(1 . 0111 0010)%x
開(kāi)頭。1.72
- 1 回答
- 0 關(guān)注
- 127 瀏覽
添加回答
舉報(bào)