去漂浮数字划分

Zhe*_* Hu 5 go

我尝试在Go中获得2.4/0.8 == 3

w:=float64(2.4)
fmt.Println(math.Floor(w/0.8),math.Floor(2.4/0.8) )
Run Code Online (Sandbox Code Playgroud)

它给了我"2 3".

问题是为什么math.Floor(w/0.8)不给我3.它是浮点数的精度限制吗?

zzz*_*zzz 9

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

推荐阅读.


and*_*olm 7

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