Golang不增加0.1

时间:2019-05-24 22:08:23

标签: go

以下Go代码

for i := 0.0 ; i < 5 ; i+=0.1 { fmt.Printf("%v, ", i) }

产生此(部分)输出

0, 0.1, 0.2, 0.30000000000000004, 0.4, 0.5

为什么我得到0.30000000000000004而不是0.3?

2 个答案:

答案 0 :(得分:5)

二进制浮点数不能精确地保留1/10,就像具有有限位数的十进制数不能精确地保留1/3。当您不断重复添加0.1时,这些错误加起来就足以在程序的输出中显示出来。

解决此问题的最佳方法是使用整数作为循环控制变量,并在每次迭代时从中计算出浮点值:

for i := 1; i < 50; i++ {
    f := float64(i) / 10
    fmt.Printf("%v, ", f)
}

请注意,我将除以10而不是乘以0.1(实际上是乘以0.1的二进制近似值)。

答案 1 :(得分:1)

简短答案: 它与数字在计算机中的存储方式有关。

专门针对GoLang,您可能需要阅读"Floating Point Numbers"