Java - 2.0和2.00000000000D之间的实际差异

时间:2016-03-12 22:14:51

标签: java variables double precision

我重写了其他人一段时间后写过的一些科学代码,并且在整个代码常量中总是声明为:

final double value = 2.0000000000D;

附有明显任意长度的所谓有效数字。我敢肯定以这种方式声明变量实际上什么都不做,并且将值设置为:

double value = 2.0;

会完全一样。但是,为了确定,我问过,以这种方式宣称一个常数会产生任何(有意义的)差异,或者这可能只是另一种语言的遗留物,它可能会有所作为?

编辑:回答以下答案:是的,我在询问此问题之前验证了此特定实例中的答案是否相同。也许我应该更具体。是否存在一个实例,我们希望增加额外的"重要的"数字实际上会返回不同的数字?我想如果我们得到浮点数开始出现分辨率问题的非常大或非常小的值,那么这是可能的吗?

2 个答案:

答案 0 :(得分:3)

在你的例子中没有区别。你可以验证这个,

final double value1 = 2.0000000000D;
double value2 = 2.0;
System.out.println(value1 == value2);

哪个输出

true

使用double value2 = 2.;

也是合法的

答案 1 :(得分:0)

呃,遗留代码肯定存在一些误解。

spring:
    mail: 
        host: smtp.gmail.com
        port: 587
        user: spoonatte@gmail.com
        password: password
        protocol: smtp
        tls: true
        auth: true
        from: spoonatte@gmail.com
        properties.mail.smtp:
            auth: true
            starttls.enable: true
            ssl.trust: smtp.gmail.com

运作良好。

将小数设置为零是没有意义的,将小数设置为double可能是错误的。例如,

double value=2 

很可笑:

  • 开发人员假设double确实具有任意小数精度 - 但情况并非如此
  • 开发人员假设double将存储与预期相同的十进制数 - 但事实并非如此,因为它以二进制分数而非十进制分数存储。

为了精确计算,请考虑使用BigDecimal(并传递String中的初始值以确保不会丢失小数)。