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

Java - Practical difference between 2.0 and 2.00000000000D

我正在重写前一段时间别人写的一些科学代码,并且在整个代码中常量始终声明为:

final double value = 2.0000000000D;

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

double value = 2.0;

完全一样。但可以肯定的是,我问的是,以这种方式声明常量是否会产生任何(有意义的)差异,或者这可能只是另一种语言的遗留物,它可能会有所不同?

编辑:回应以下答案:是的,在问这个问题之前,我验证了这个特定实例中的答案是相同的。也许我应该更具体一些。有没有一个例子,我们期望添加额外的 "significant" 数字实际上会 return 一个不同的数字?我想如果我们得到非常大或非常小的值,浮点数开始出现分辨率问题,这是可能的吗?

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

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

输出

true

使用double value2 = 2.;

也是合法的

呃,那个遗留代码肯定有什么误解。

double value=2 

效果很好。

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

double preciseNumber=3.1415926535897932384626433832795028;

是假的:

  • 开发人员假设 double 确实具有任意小数精度 - 但事实并非如此
  • 开发人员假定双精度数将按预期存储相同的十进制数 - 但事实并非如此,因为它存储在二进制小数而不是小数中。

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