繁体   English   中英

Java Double vs BigDecimal

[英]Java Double vs BigDecimal

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

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

正如Double#toStringjavadoc中所解释的那样:

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

BigDecimal#toString的javadoc

如果比例大于或等于零且调整后的指数大于或等于-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);
}

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

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

存储这些的基础数据结构是不同的(从我的回忆浮点可以有更广泛的值,但BigDecimal有更多的准确性),但你实际看到的只是输出相同数字的不同方式。 我认为它存在这种方式,因为浮点范围较大; 输出荒谬的大数字没有科学记数法只是令人讨厌,所以我认为科学记数法是默认的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM