我尝试在 Go 中获得 2.4/0.8 == 3
w:=float64(2.4)
fmt.Println(math.Floor(w/0.8),math.Floor(2.4/0.8) )
它给了我“2 3”。
问题是为什么math.Floor(w/0.8)
不给我3。是浮点数的精度限制吗?
我尝试在 Go 中获得 2.4/0.8 == 3
w:=float64(2.4)
fmt.Println(math.Floor(w/0.8),math.Floor(2.4/0.8) )
它给了我“2 3”。
问题是为什么math.Floor(w/0.8)
不给我3。是浮点数的精度限制吗?
程序输出是正确的。IEEE 格式中许多实数的表示并不精确。第一个数字实际上(在其有限的 64 位版本中)小于 3,因此 floor 正确返回“2”。第二个是在编译时使用更高的精度计算的。
推荐阅读。
是的,这是精度限制。float64 非常精确,但 2.4 不能完全以二进制形式存储。当两个数字都是常数时,在编译时以更高的精度进行计算,当结果四舍五入到 float64 时,结果正好是 3。但是当其中一个数字是变量时,必须进行计算在运行时,结果为 2.9999999999999996,Floor 截断为 2。
虽然这不能回答问题(为什么),但我发现这个页面正在寻找一个圆形函数,所以以防万一有人发现它有帮助,这是我自己的解决方案:
func Round(val float64) (float64) {
if float64(int(val)) < val {
return float64(int(val) + 1)
}
return val
}