ANi*_*sus 25

math.Float32bitsmath.Float64bits

结果:

float32(0.1): 00111101110011001100110011001101
float32(0.2): 00111110010011001100110011001101
float32(0.3): 00111110100110011001100110011010
float64(0.1): 0011111110111001100110011001100110011001100110011001100110011010
float64(0.2): 0011111111001001100110011001100110011001100110011001100110011010
float64(0.3): 0011111111010011001100110011001100110011001100110011001100110011
a
0.20000000298023224
+ 0.10000000149011612
- 0.30000001192092896
= -7.4505806e-9

负值,永远不能总和为1.

那么,为什么C表现不同?

如果你看一下二进制模式(并且稍微知道如何表示二进制值),你可以看到Go绕过最后一位,而我假设C只是裁剪它.

因此,从某种意义上说,虽然Go和C都不能在浮点数中精确地表示0.1,但Go使用最接近0.1的值:

Go:   00111101110011001100110011001101 => 0.10000000149011612
C(?): 00111101110011001100110011001100 => 0.09999999403953552

我发布了一个关于C如何处理浮点常量的问题,从答案来看,似乎允许C标准的任何实现.您尝试使用它的实现只是与Go不同.

  • 不需要`strconv.FormatUint(x,2)`,`fmt.Printf`具有"%b"格式.不需要`unsafe`,有`math.Float32bits`和`math.Float64bits`.更好的版本是:https://play.golang.org/p/ZqzdCZLfvC (4认同)