首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java Double vs BigDecimal

问Java Double vs BigDecimal
EN

Stack Overflow用户
提问于 2012-09-06 00:42:00
回答 3查看 758关注 0票数 2

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-09-06 00:53:15

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

正如javadoc of Double#toString中所解释的

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

而the javadoc of BigDecimal#toString

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

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

输出:

代码语言:javascript
复制
0.5                         0.5
3.0517578125E-5             0.000030517578125
9.5367431640625E-7          9.5367431640625E-7

代码:

代码语言:javascript
复制
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);
}
票数 6
EN

Stack Overflow用户

发布于 2012-09-06 00:44:05

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

票数 3
EN

Stack Overflow用户

发布于 2012-09-06 00:44:29

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

存储这些值的底层数据结构是不同的(根据我的记忆,浮点数可以有更大范围的值,但BigDecimal更准确),但您实际看到的只是输出相同数字的不同方式。我假设它以这种方式存在,因为浮点数的范围更大;输出荒谬的大数字而不使用科学记数法是令人讨厌的,所以我认为科学记数法是默认的。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12286064

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档