Big Decimal vs double 提供更好的精度

Big Decimal vs double which provides better precision

我在遗留软件中找到了一些代码,我很想知道哪个提供了更好的精度,因为它目前是取双精度并计算它们的地方:

double doubleNum = (Math.round(55.88d * 100) - Math.round(2.33d * 100));

第二个选项

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

System.out.println(bnv.subtract(bsv).setScale(2));

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

时可能会丢失

还有第一个选项在转换时可能会丢失..

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

BigDecimal 是一种表示数字的精确方式,并且不受 double 那样的四舍五入的影响。丢失精度的问题是在分配给 double 时,而不是在从 double 转换为 BigDecimal 时。

更多详情可以看这个post:Double vs. BigDecimal?

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

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

BigDecimal bnv = new BigDecimal("55.88");
BigDecimal bsv = new BigDecimal("2.33");

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

对于 BigDecimal,有时必须提供舍入等结果的精度。

所以 BigDecimal 更胜一筹,而不是因为它可怕的 cobolish 表达式。