1 回答

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