java同数加减双精度错误

问题描述 投票:0回答:1

由于浮点数不准确,java的double不能精确表示每一个十进制数,即引入精度误差。 给定以下代码:

double d1=0.20976190476190476;
double d2=0.062142857142857146;
System.out.println("d1-d1= "+(d1-d1)); //Prints 0.0.
System.out.println("d1+d2-d2-d1= "+(d1+d2-d2-d1)); //Prints 2.7755575615628914E-17

我很好奇最后一行怎么会产生精度错误?我假设表达式被计算为:((d1+d2)-d2)-d1。所以即使 d1、d2 或 (d1+d2) 没有准确表示,我会假设精度误差会相互抵消?

java precision
1个回答
1
投票

来自 jshell(交互式 java shell): jshell> d1+d2-d2 $6 ==> 0.2097619047619048

不等于 d1,因此您可以快速确认错误不会相互抵消。

浮点数的奇怪行为的一个极端例子是将一个非常小的数加到一个非常大的数上——这个加法甚至可能不会改变大的值,所以通常 d1 + d2 可以等于 d1,即使当d2 不为零。

浮点数学是棘手的,其中数字准确性非常重要确保您使用/理解手头的算法,使用专家编写的库,或使用 BigDecimal 或其他任意精度数字。

© www.soinside.com 2019 - 2024. All rights reserved.