1 回答

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