Java Math.sqrt计算1/12时结果为0的原因分析
问题根本原因
所有计算异常的核心触发点是 Java的整数除法规则,和Math.sqrt的计算精度、T分数的业务逻辑本身无关。
第一处异常:Math.sqrt(0.0833) 与 Math.sqrt(1/12) 结果差异明显
Java的强类型运算规则规定:当除法运算符/的两个操作数都是int类型时,会执行整数截断除法——直接丢弃所有小数部分取整,不会保留数学意义上的分数结果。
你代码里写的1/12中,1和12都是不带小数点的int字面量,运算时首先执行整数除法:1 / 12 = 0(而非数学上的0.08333...)。把这个0传入Math.sqrt得到的结果就是0,和入参0.0833算出的≈0.2887存在量级上的本质差异。
你代码中那行System.out.println(Math.sqrt(1/12)); 实际控制台输出是0.0,而非预期的≈0.2887,就是这个规则导致的。
第二处异常:手写1/24相加开平方时,T分数结果始终为0
这个问题的触发逻辑和上面完全同源:
- 代码里写的两个
1/24都是整数字面量参与运算,单组计算结果都是整数截断后的0 - 两个0相加的结果仍为0,开平方后值还是0
- 后续计算时,这部分值作为乘数和之前算出的
tempSp相乘,直接把temp值拉为0,完全偏离预期计算路径,最终得不到正确结果。
正确的修复写法
要让除法按浮点数规则保留小数,只需要让运算链路中至少有一个操作数是浮点数类型即可,常见实现方式:
- 直接使用带小数点的字面量:
1.0 / 12、1.0/24 + 1.0/24 - 对整数做强制类型转换:
(double)1 / 12
内容的提问来源于stack exchange,提问作者Dylan Womble
相关产品推荐
相关产品推荐

