2

我正在查看一些使用双变量来存储 (360-359.9998779296875) 结果的代码,即 0.0001220703125。double 变量将其存储为 -1.220703125E-4。当我使用 BigDecimal 时,它存储为 0.0001220703125。为什么双重存储为-1.220703125E-4?

4

3 回答 3

6

我不会在这里提到精度问题,而只会提到打印数字的方式。

正如javadoc 中所解释的Double#toString

如果 m 小于 10^-3 或大于或等于 10^7,则它以所谓的“计算机科学记数法”表示。

javadoc 的BigDecimal#toString

如果小数位数大于等于零且调整后的指数大于等于-6,则不使用指数表示法将数字转换为字符形式

你可以试试这个小程序来检查各种输出格式,特别是表示从标准计数法切换到科学计数法的阈值在这两个类中是不一样的。

输出:

0.5                         0.5
3.0517578125E-5             0.000030517578125
9.5367431640625E-7          9.5367431640625E-7

代码:

public static void main(String args[]) {
    //trying to use numbers with an exact double representation
    double d1 = 0.5;
    double d2 = 0.000030517578125;
    double d3 = 0.00000095367431640625;

    BigDecimal bd1 = new BigDecimal(d1);
    BigDecimal bd2 = new BigDecimal(d2);
    BigDecimal bd3 = new BigDecimal(d3);

    System.out.println(d1 + "\t\t\t" + bd1);
    System.out.println(d2 + "\t\t" + bd2);
    System.out.println(d3 + "\t" + bd3);
}
于 2012-09-05T16:53:14.783 回答
3

两者都是一样的。无论您使用什么工具/IDE,都会以不同的格式显示它们。

于 2012-09-05T16:44:04.500 回答
3

http://epramono.blogspot.com/2005/01/double-vs-bigdecimal.html

存储这些数据的底层数据结构是不同的(据我的回忆,浮点可以有更广泛的值,但 BigDecimal 具有更高的准确性),但您实际看到的只是输出相同数字的不同方式。我会假设它以这种方式存在,因为浮点范围更大;在没有科学记数法的情况下输出大得离谱的数字是令人讨厌的,所以我相信科学记数法是默认设置。

于 2012-09-05T16:44:29.193 回答