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 关注
- 88 浏览
添加回答
举报