【问题标题】:How to deal with underflow in java?如何处理java中的下溢?
【发布时间】:2020-02-19 03:58:06
【问题描述】:

问题来了

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

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

【问题讨论】:

  • 1.0665901062490447E-18 是一个非常很小的值。
  • @ElliottFrisch 是的,我知道。对此我能做些什么吗?
  • 不要使用双打。

标签: java underflow


【解决方案1】:

正如我在my comment 中提到的,1.0665901062490447E-18 是一个非常小值。如果你需要这么高的精度,你应该使用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());

【讨论】:

    【解决方案2】:

    几乎所有语言中的基本类型都存在限制。在这种情况下,我相信double 类型受IEEE-754 的约束。为了处理此类问题,Arbitrary Precision Libraries 已针对多种语言创建。

    经典的"What Every Computer Scientist Should Know About Floating Point Arithmetic" 是所有浮点数据类型使用的必读。

    【讨论】:

      猜你喜欢
      • 2011-08-12
      • 2016-01-05
      • 2013-07-10
      • 2019-05-17
      • 1970-01-01
      • 2021-12-15
      • 2013-06-29
      相关资源
      最近更新 更多