You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

三位小数数值比较方法异常:特定测试用例结果不符预期

问题根源

你遇到的问题是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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 16:14:52