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