双数不太准确

时间:2017-01-26 11:29:44

标签: java variables double calculus

我已经为多项式长除法编写了一个方法。它与#34; good"完美结合。多项式。在"好"我的意思是系数分开准确。今天我试图划分2*x^3-18*x^2+.... / 7.00000(much zeros)0000028*x^2 + 5*x + ..时遇到了问题。分割后2*x^3 / 7.000...000028*x^2我得到0.285714....53*x。在下一步,我们需要在0.2857....53*x上乘以7.00000...0000028*x^2 + 5*x + ..并从红利多项式2*x^3-18*x^2+...中减去它,并获得度数为2的新多项式。但由于double类型I的问题实际上有多项式2.220....E-16*x^3 - 6*x^2 + ...。我知道它在x^3附近实际上是零。我不想发明新的和奇怪的,这就是为什么我要问如何精美和正确地解决它。谢谢。

1 个答案:

答案 0 :(得分:2)

许多除法结果(如1/7)无法在double或BigDecimal中精确表示。如果你使用BigDecimal,你必须选择一些数字来保存,并处理舍入错误。对于double,您可以获得更方便的算术,但是有一定数量的有效位。

您有两种选择。

一个是处理舍入错误。当结果非常接近零时,如此接近以至于可能是由于舍入误差,将其视为零。我不知道这是否适用于您的算法。如果你这样做,你可以使用double或BigDecimal。

第二种选择是使用有理数字包。在有理数运算中,所有除法结果都可以精确表示。 1/7保持1/7,而不是舍入到终止的十进制或二进制分数。如果你这样做,搜索“java有理数”(没有引号)并决定你最喜欢哪一个。