Java中Double转Int显式类型转换的舍入规则疑问
为什么double转int时部分高精度小数会出现异常取整?
这本质是IEEE 754双精度浮点数的精度限制导致的,Java的double类型遵循该标准,仅能提供53位有效二进制精度,对应约15-17位十进制有效数字。超出这个范围的十进制字面量,会被自动舍入到最接近的可表示double值,而非精确存储。
逐个分析你代码里的变量:
double a = 5.9999999999999999:这个字面量的十进制位数超过了53位精度的极限,实际存储时会被舍入到6.0,所以用(int)强制转换时自然得到6。double b = 5.999999999999999:这个数刚好在53位精度的可表示范围内,实际存储值是略小于6.0的,(int)转换会直接截断小数部分,因此得到5。double a1 = 5.8888888888888888:虽然是16位精度,但它的舍入结果是小于6.0的最接近double值,截断后得到5。double c = 5.11111111111111111111...:无论后面追加多少位,舍入后的double值始终小于6.0,截断小数部分后结果为5。
注意:Java中(int)强制转换的逻辑是直接丢弃小数部分,并非四舍五入。最终结果由变量实际存储的double值决定,而非你编写的十进制字面量。
内容的提问来源于stack exchange,提问作者Evloution78
相关产品推荐
相关产品推荐

