遵循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
Run Code Online (Sandbox Code Playgroud)
为什么我得到0.30000000000000004而不是0.3?
二进制浮点数不能精确地容纳1/10,就像十进制数有限的数字不能精确地容纳1/3。当您重复添加0.1时,这些错误加起来就足以在程序的输出中显示出来。
解决此问题的最佳方法是使用整数作为循环控制变量,并在每次迭代时从中计算出浮点值:
for i := 1; i < 50; i++ {
f := float64(i) / 10
fmt.Printf("%v, ", f)
}
Run Code Online (Sandbox Code Playgroud)
请注意,我是除以10而不是乘以0.1(实际上是乘以0.1的二进制近似值)。
| 归档时间: |
|
| 查看次数: |
64 次 |
| 最近记录: |