我在遗留软件中找到了一些代码,我有兴趣知道哪个提供了更好的精度,因为它目前是采用双精度并对其进行计算的地方:
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,但在这种情况下。
浮点数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 表达式。