我不确定我这样做是否正确。
我正在做需要尽可能准确的科学计算,因此我将现有的使用转换Double
为BigDecimal
.
// before
double tmp = x - (y / z);
// after
BigDecimal tmp = new BigDecimal(
x.value().subtract(y.value().divide(z.value())).toString());
这是合乎逻辑的还是什么?
我不确定我这样做是否正确。
我正在做需要尽可能准确的科学计算,因此我将现有的使用转换Double
为BigDecimal
.
// before
double tmp = x - (y / z);
// after
BigDecimal tmp = new BigDecimal(
x.value().subtract(y.value().divide(z.value())).toString());
这是合乎逻辑的还是什么?
在将结果转换为 BigDecimal 之前,您正在使用双精度数进行算术运算。这样你就不会获得任何精度。
您应该尽快将每个数字转换为 BigDecimal,然后在 BigDecimal 表示上使用 BigDecimals 的方法(减法、除法等)来进行算术运算。
BigDecimal bdX = new BigDecimal(x);
BigDecimal bdY = new BigDecimal(y);
BigDecimal bdZ = new BigDecimal(z);
BigDecimal tmp = bdX.subtract(bdY.divide(bdZ));
BigDecimal
具有所有运算符的方法。您应该改用它们。您还可以控制(指定)比例和舍入。
避免使用双打,而是BigDecimal
从头开始使用。
假设 x、y 和 z 是双精度数
BigDecimal tmp = new BigDecimal(x).subtract(
new BigDecimal(y).divide(new BigDecimal(z), MathContext.DECIMAL64));
请参阅 BigDecimal.divide API 以了解为什么要使用 MathContext