Java BigDecimal CompareTo 不适用于小数

问题描述

我需要为一个人工智能项目比较极小的数字。这是我的方法

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;
    }

这是我的输出,返回值打印在第三个:

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 个零)。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...