5

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

4

3 回答 3

9

程序输出是正确的。IEEE 格式中许多实数的表示并不精确。第一个数字实际上(在其有限的 64 位版本中)小于 3,因此 floor 正确返回“2”。第二个是在编译时使用更高的精度计算的。

推荐阅读

于 2013-03-11T15:46:37.653 回答
7

是的,这是精度限制。float64 非常精确,但 2.4 不能完全以二进制形式存储。当两个数字都是常数时,在编译时以更高的精度进行计算,当结果四舍五入到 float64 时,结果正好是 3。但是当其中一个数字是变量时,必须进行计算在运行时,结果为 2.9999999999999996,Floor 截断为 2。

于 2013-03-11T16:12:52.463 回答
-1

虽然这不能回答问题(为什么),但我发现这个页面正在寻找一个圆形函数,所以以防万一有人发现它有帮助,这是我自己的解决方案:

   func Round(val float64) (float64) {
        if float64(int(val)) < val {
            return float64(int(val) + 1)
        }
        return val
    }
于 2014-07-24T08:08:39.513 回答