Java非常小的数字算术运算

Java非常小的数字算术运算,java,numbers,arithmetic-expressions,Java,Numbers,Arithmetic Expressions,表达式的结果:2.227E-19-1.0+1.0将为0.0 如何获得2.227E-19的结果 我有一个表情 a-b+1 及 a总是一个非常小的数字 b可能接近1.0 当一个非常小的数字与一个很大的数字一起运算时,如何保持准确性?只需使用一个双精度即可存储结果。它的精度足以进行此计算。如果事先知道哪些操作数可能较小,则可以对操作重新排序: -b + 1 + a 这样,将首先计算a之前的部分,并且两侧(-b+1和a)的大小大致相同,从而导致较少的浮点问题 以下是相关章节: 同一行上的运算符具

表达式的结果:
2.227E-19-1.0+1.0
将为0.0

如何获得2.227E-19的结果

我有一个表情

a-b+1

  • a总是一个非常小的数字
  • b可能接近1.0

当一个非常小的数字与一个很大的数字一起运算时,如何保持准确性?只需使用一个
双精度
即可存储结果。它的精度足以进行此计算。

如果事先知道哪些操作数可能较小,则可以对操作重新排序:

-b + 1 + a
这样,将首先计算
a
之前的部分,并且两侧(
-b+1
a
)的大小大致相同,从而导致较少的浮点问题

以下是相关章节:

同一行上的运算符具有相同的优先级。当同等优先级的运算符出现在同一表达式中时,必须有一条规则来控制首先求值的运算符。除赋值运算符外,所有二进制运算符都从左到右求值


或者使用具有足够刻度的BigDecimal

有什么问题?你得到了什么?
a
b
的值是什么?
+(1.0-b)
。但这是一个假象:IEEE double有16位精度,因此
b
和1之间的最小变化大于
a
的大小——你基本上已经失去了所有精度。我不认为这是真的,用给定的值进行测试,即使精度达到两倍,结果也为0。上面给出的精度更高,但没有更高的精度。我不确定你的确切意思;至少在
b=1
的情况下,这种方法可以避免
a
被取消,这是我所能看到的主要问题。如果
b
真的是
1-1.0E-17
如果以更高的精度计算,总体结果将与2.227E-19大不相同。重新排列顺序以产生明显更精确的结果并不会产生更精确的结果。