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为什么我需要设置刻度?