为什么从float64到int的转换会导致值增加1?
将630948893921274879float64 类型转换为 int 时,我希望结果为630948893921274879. 但是,实际结果是630948893921274880,比 1 大。
这是什么原因?
import (
"fmt"
)
func main() {
var p float64 = 630948893921274879
fmt.Println(int(p)) // 630948893921274880
fmt.Printf("%fn", p) // 630948893921274880.000000
}
https://play.golang.org/p/gbXKCkZ6_rF
回答
float64不会比int64“免费”变得“更大”。它在精度和范围之间进行权衡。
达到一定量级后,整数只能表示为最接近的 2。当你变得更大时,你最终会跳过每 4,然后每 8,依此类推。
回答
630948893921274879 大于不舍float64入可以编码的最大整数。“浮点数”(即浮点数)的工作方式与科学记数法相同。它们存储一定数量的有效数字,然后将其乘以 2 的某个幂。630948893921274879 需要比 float64 可以容纳的更多有效数字,因此它会四舍五入到它可以表示的最接近的值。
如果您需要处理这么大的整数,则需要一直使用整数。您不能转换为浮点值。