去漂浮数字划分

时间:2013-03-11 15:25:51

标签: go

我尝试在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.它是浮点数的精度限制吗?

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
    }