三位小数数值比较方法异常:特定测试用例结果不符预期
问题根源
你遇到的问题是double类型的二进制浮点数精度限制导致的。像3.174和3.175这类十进制小数,无法被精确转换为二进制浮点数存储,它们在JVM中的实际值会和字面量有微小偏差。这就导致你代码中判断的firstNumber - secondNumber < 0.001意外成立,返回了不符合预期的true。
修复方案
要准确判断两个数在三位小数精度下是否相等,最可靠的方式是把浮点数转换为整数比较——将两个数乘以1000后取整,再对比整数是否一致。这样完全绕开浮点数的精度问题。
修改后的代码:
public class DecimalComparator { public static void main(String[] args) { System.out.println(areEqualByThreeDecimalPlaces(3.174, 3.175)); // 输出false System.out.println(areEqualByThreeDecimalPlaces(3.175, 3.176)); // 输出false } public static boolean areEqualByThreeDecimalPlaces(double firstNumber, double secondNumber) { long firstScaled = Math.round(firstNumber * 1000); long secondScaled = Math.round(secondNumber * 1000); return firstScaled == secondScaled; } }
为什么这样有效
Math.round()会对放大后的数值做四舍五入,精准对齐到三位小数的精度,符合你对“三位小数相等”的定义。- 使用
long存储取整后的值,避免了大数值超出int范围的风险。 - 整数比较完全不存在精度误差,结果绝对可靠。
内容的提问来源于stack exchange,提问作者Sinan Burak Filiz
相关产品推荐
相关产品推荐

