大十进制与双精度相比,提供更好的精度

use*_*190 0 java bigdecimal

我在遗留软件中找到了一些代码,我有兴趣知道哪个提供了更好的精度,因为它目前是采用双精度并对其进行计算的地方:

double doubleNum = (Math.round(55.88d * 100) - Math.round(2.33d * 100));
Run Code Online (Sandbox Code Playgroud)

第二个选择

BigDecimal bnv = BigDecimal.valueOf(55.88);
BigDecimal bsv = BigDecimal.valueOf(2.33);

System.out.println(bnv.subtract(bsv).setScale(2));
Run Code Online (Sandbox Code Playgroud)

两者产生相同的输出,我的理解是使用 bigdecimal 确保更精确。但是将 double 转换为 BigDecimal 时可能会出现损失

此外,第一个选项在铸造时可能会造成损失。

我总是使用 BigDecimal,但在这种情况下。

Joo*_*gen 5

浮点数double始终只是一个(不精确的)近似值,即 2 的幂之和 - 没有任何精度 = 小数位数的概念。55.88 和 55.879999998 可能是完全相同的值(相同的字节)。

BigDecimal解决了这个问题。但是您不想要一个带有double参数的构造函数,因为那样精度也会丢失。使用:

BigDecimal bnv = new BigDecimal("55.88");
BigDecimal bsv = new BigDecimal("2.33");
Run Code Online (Sandbox Code Playgroud)

以上两者的精度均为 2,乘法的精度为 4。

使用 BigDecimal 有时必须提供舍入等结果的精度。

所以 BigDecimal 更优越,并不是因为它可怕的 cobolish 表达式。