You need to enable JavaScript to run this app. 为什么float64类型数值转换为int类型时会出现数值加1的情况?
优惠活动
大模型
产品
解决方案
定价
更多

为什么float64类型数值转换为int类型时会出现数值加1的情况?

问题现象

当将float64类型的数值630948893921274879转换为int类型时,预期输出结果为630948893921274879,但实际运行后得到的结果是630948893921274880,数值比原值大了1。

复现代码:

import (
    "fmt"
)

func main() {
    var p float64 = 630948893921274879
    fmt.Println(int(p))   // 630948893921274880
    fmt.Printf("%f\n", p) // 630948893921274880.000000
}
原因解答

这是IEEE 754双精度浮点数(即Go中的float64)的精度限制导致的正常现象:

  • float64采用1位符号位、11位指数位、52位尾数位的存储结构,由于尾数隐含最高位的1,实际能提供的有效整数精度为53个二进制位。
  • 这意味着float64可以精确表示的最大整数是2^53(即9007199254740992),所有大于2^53的整数,float64都无法做到逐个精确表示,数值越大,可表示的相邻整数的间隔就越大。
  • 本次使用的数值630948893921274879远大于2^53,无法被float64精确存储,赋值时会自动舍入到距离它最近的、可被float64表示的数值,也就是630948893921274880,后续转int操作只是读取了float64变量里实际存储的这个舍入后的值,才会出现最终结果比原值大1的情况。

内容的提问来源于stack exchange,提问作者Vaelin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.13 09:21:04