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。