如何处理java中的下溢?

How to deal with underflow in java?

问题来了

double a = 1.0665901062490447E-18;
double b = 1.0;
double c = a+b; // this is 1.0

我需要那个总和值。我该怎么办?

正如我在 , 1.0665901062490447E-18 is a very small value. If you need that much precision, you should be using BigDecimal 中提到的那样。像,

double a = 1.0665901062490447E-18, b = 1.0;
System.out.println(BigDecimal.valueOf(a).add(BigDecimal.valueOf(b)).toPlainString());

输出

1.0000000000000000010665901062490447

注意有一个预定义的常量BigDecimal.ONE - 所以上面的也可以写成

System.out.println(BigDecimal.valueOf(a).add(BigDecimal.ONE).toPlainString());

几乎所有语言的基本类型都存在限制。在这种情况下,我认为 IEEE-754. In order to handle these class of problems Arbitrary Precision Libraries 绑定的 double 类型已为多种语言创建。

经典《What Every Computer Scientist 应该了解浮点数 算术 是浮点数据类型所有用途的必需阅读。