Java BigDecimal CompareTo 不适用于小数字
Java BigDecimal CompareTo Not Working with Small Numbers
我需要为人工智能项目比较极小的数字。这是我的方法:
private static int maximum(BigDecimal a1, BigDecimal a2){
System.out.println(a1);
System.out.println(a2);
if (a1.compareTo(a2)<0){
return 1;
}else{
return 0;
}
这是我的输出,第 3 个打印的是 return 值:
0E-917
0E-912
0
0E-918
0E-921
0
0E-932
0E-933
0
有什么方法可以比较我用 compareTo 方法犯的这个小错误或一些简单错误的数字吗?感谢您的帮助!
0Ewhatever
仍然是 0。它们都是零。
E-932
甚至还存在的原因是因为 BigDecimal 不存储 只是 数字,它也知道你的精度; 0E-917
为 0,但具有一定的精度。
如规范所述,compareTo
检查实际值并忽略精度级别,因此,所有这些值彼此 100% 相等:它们都是 0。
编辑:需要说明的是,0E-917
不是“极小的数字”。 为零。那个精确的东西是有效的:一些计算是 0.00000000....000000
,有 917 个零。它可能是非零的,但如果是,它只有在 至少 917 个零之后才有一个非零数字,我没有计算那么远。这个,你的BD实例绝对没有办法知道(它只存储了918个零)。
我需要为人工智能项目比较极小的数字。这是我的方法:
private static int maximum(BigDecimal a1, BigDecimal a2){
System.out.println(a1);
System.out.println(a2);
if (a1.compareTo(a2)<0){
return 1;
}else{
return 0;
}
这是我的输出,第 3 个打印的是 return 值:
0E-917
0E-912
0
0E-918
0E-921
0
0E-932
0E-933
0
有什么方法可以比较我用 compareTo 方法犯的这个小错误或一些简单错误的数字吗?感谢您的帮助!
0Ewhatever
仍然是 0。它们都是零。
E-932
甚至还存在的原因是因为 BigDecimal 不存储 只是 数字,它也知道你的精度; 0E-917
为 0,但具有一定的精度。
如规范所述,compareTo
检查实际值并忽略精度级别,因此,所有这些值彼此 100% 相等:它们都是 0。
编辑:需要说明的是,0E-917
不是“极小的数字”。 为零。那个精确的东西是有效的:一些计算是 0.00000000....000000
,有 917 个零。它可能是非零的,但如果是,它只有在 至少 917 个零之后才有一个非零数字,我没有计算那么远。这个,你的BD实例绝对没有办法知道(它只存储了918个零)。