Java 一个BigDecimal近似等于另一个BigDecimal

Java 一个BigDecimal近似等于另一个BigDecimal,java,precision,bigdecimal,Java,Precision,Bigdecimal,我广泛使用大小数。我经常需要做长时间的计算,然后比较结果。由于这些冗长的计算,答案不是1,而是0.999999…。这就是为什么我不能准确地比较大小数,而只能比较某个错误 如何检查一个大十进制数是否在另一个的ε内 备注:我已经知道答案.减法(预期).abs().compareTo(epsilon)

我广泛使用大小数。我经常需要做长时间的计算,然后比较结果。由于这些冗长的计算,答案不是
1
,而是
0.999999…
。这就是为什么我不能准确地比较大小数,而只能比较某个错误

如何检查一个大十进制数是否在另一个的ε内

备注:我已经知道
答案.减法(预期).abs().compareTo(epsilon)<0
。但我必须一遍又一遍地写,我正在寻找一种更简单的方法来写

BigDecimal错误=新的BigDecimal(1e-5);
BigDecimal error = new BigDecimal(1e-5);    

BigDecimal a = new BigDecimal(100);
BigDecimal b = new BigDecimal(11.2);

if (a.subtract(b).abs().compareTo(error) < 0) {
    // a approximately equals b
}
BigDecimal a=新的BigDecimal(100); BigDecimal b=新的BigDecimal(11.2); 如果(a.减去(b).abs().比较到(错误)<0){ //a大约等于b }
BigDecimal错误=新的BigDecimal(1e-5);
BigDecimal a=新的BigDecimal(100);
BigDecimal b=新的BigDecimal(11.2);
如果(a.减去(b).abs().比较到(错误)<0){
//a大约等于b
}

只需在util类或其他内容中添加您自己的方法:

if(a.subtract(b).abs().setScale(精度,舍入模式.半偶数).比较到(epsilon)>0){
//他们没有什么不同

}

只需在util类或其他东西中添加您自己的方法:

if(a.subtract(b).abs().setScale(精度,舍入模式.半偶数).比较到(epsilon)>0){
//他们没有什么不同
}

无0类问题

public static boolean almostEqual(BigDecimal a, BigDecimal b) {
    int scale = Math.min(a.scale(), b.scale()) -1;
    return a.setScale(scale, RoundingMode.HALF_UP)
               .compareTo(b.setScale(scale, RoundingMode.HALF_UP)) == 0;

}
并控制比例

无0级问题

public static boolean almostEqual(BigDecimal a, BigDecimal b) {
    int scale = Math.min(a.scale(), b.scale()) -1;
    return a.setScale(scale, RoundingMode.HALF_UP)
               .compareTo(b.setScale(scale, RoundingMode.HALF_UP)) == 0;

}

控制比例

减去并与ε进行比较,这不会太难吧?如果你的计算不精确,为什么不简单地使用
double
?Commons Math有一个比较浮点和ε的方法。你需要一个库做什么?只需将差值与ε进行比较,而不是与0进行比较,就完成了。@Zinki,我知道这样做的原因,我要求一种更优雅的方法来完成它。如果你不想一遍又一遍地写一些非琐碎的东西(你不应该这么做),你应该把它放在一个方法中,然后调用该方法。减去并与ε进行比较,这不会太难吧?如果你的计算不精确,为什么不直接使用
双精度
?Commons Math有一个比较浮点和ε的方法。你需要一个库做什么?只需将差值与ε进行比较,而不是与0进行比较,您就完成了。@Zinki,我知道这种方法,如果您不想一次又一次地写一些非琐碎的东西(您不应该这样做),我要求提供一种更优雅的方法来完成它,你应该把它放在一个方法中,只调用那个方法。你需要一个abs算法。你需要一个abs算法。你需要setScale@ACV为什么我需要一个刻度盘?你需要setScale@ACV为什么我需要设置刻度?