Java双丢失精度计算

时间:2016-04-15 06:35:18

标签: java math double precision

我在Java中进行了以下双重计算:

double C1 = some value;    // It's always an integer
double C2 = some value;    // It's always integer, and C2 >= C1
double S = some value;     // It's always 0 < S <= 1
double carry = some value; // It's always 0 <= carry < 1

double rate = ((C1/C2)/S);
double C3 = Math.floor( (rate * S * C2) + carry );

现在,如果我们没有失去精确度,C3 == C1将是真的。但由于我们失去了精确度,C3C1仍然总是相等吗?

如果他们不总是平等,如果我有C1C2SC3,我怎么能修改rate到确保计算后C3等于C1

注意:遗憾的是,使用BigDecimal不是一种选择。

2 个答案:

答案 0 :(得分:3)

通常,我们不会直接通过==比较两个双值。相反,我们衡量它们之间的差异。例如Math.abs(C3 - C1) < 1e-6

答案 1 :(得分:3)

不是这样。

浮点是近似值。添加到尾数的下一个双位1位可能会导致这两个双精度数之间的大指数存在相当大的差距。

S接近0将导致巨大的双打,它们之间有很大的差距。通过这种简单的舍入,这将不再是可纠正的。即使小S不会导致除法超过INFINITY的双倍范围。

一个人可以很容易地达到1000。