为什么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
相关产品推荐
相关产品推荐

