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

如果将这些二进制表示转换为十进制值并进行循环,则可以看到对于float32,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如何处理float常量的问题 ,从答案看来,C标准的任何实现都可以做。 你尝试的实现只是做了不同于Go。