Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/335.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java—2.0和2.00000000000D之间的实际差异_Java_Variables_Double_Precision - Fatal编程技术网

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

Java—2.0和2.00000000000D之间的实际差异,java,variables,double,precision,Java,Variables,Double,Precision,我正在重写别人不久前编写的一些科学代码,在整个代码中,常量始终声明为: final double value = 2.0000000000D; 带有明显任意长度的假定有效数字。我95%确信以这种方式声明变量实际上没有任何作用,并且将值设置为: double value = 2.0; 完全一样。但我想确定的是,以这种方式声明一个常数是否会产生任何(有意义的)差异,或者这可能只是另一种语言的遗物,而在另一种语言中它可能会产生差异 编辑:回答下面的一个答案:是的,在问这个问题之前,我验证了在这个特

我正在重写别人不久前编写的一些科学代码,在整个代码中,常量始终声明为:

final double value = 2.0000000000D;
带有明显任意长度的假定有效数字。我95%确信以这种方式声明变量实际上没有任何作用,并且将值设置为:

double value = 2.0;
完全一样。但我想确定的是,以这种方式声明一个常数是否会产生任何(有意义的)差异,或者这可能只是另一种语言的遗物,而在另一种语言中它可能会产生差异


编辑:回答下面的一个答案:是的,在问这个问题之前,我验证了在这个特定的例子中答案是相同的。也许我应该更具体一点。是否曾经有过这样的情况,我们期望添加额外的“有效”数字实际上会返回不同的数字?我想如果我们得到非常大或非常小的值,浮点数开始有分辨率问题,这是可能的?

在您的示例中,这没有什么区别。你可以这样验证

final double value1 = 2.0000000000D;
double value2 = 2.0;
System.out.println(value1 == value2);
哪个输出

true

使用
双值2=2也是合法的

嗯,在遗留代码中肯定存在一些误解

double value=2 
效果很好

将小数设置为零是毫无意义的,而将小数设置为双精度很可能是错误的。比如说,

double preciseNumber=3.1415926535897932384626433832795028;
这是假的:

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

为了精确计算,考虑使用BigDeCimple(并在字符串中传递初始值,以确保没有小数点丢失)。< / P>是的,在询问这个问题之前,我也验证了这个问题。也许我应该更具体一点。是否曾经有过这样的情况,我们希望情况并非如此?或者仅仅是double value=2;:)<代码>系统输出打印项次(0.05+0.05+0.05)Java紧随其后,有些数字不能精确地用二进制表示(就像用十进制表示,

1/3
)。@GeeBee True,扩大转换也可以。但是
2.
是一个
double
(没有加宽)。BigDecimal不能像double那样精确地表示pi。好的捕获:)但是你得到了一个要点:一旦它有无穷的小数,它就可以精确地用BigDecimal表示。然而,它很可能成为一个无止境的二进制小数,因此double不能始终正确地表示小数。有没有尝试过准确地表示BigDecimal中的三分之一?你碰到的问题和用双精度表示十分之一完全一样。@Patricia,我理解你的意思,我可以看出二进制和十进制分数都有问题。然而,这不是同一个问题。作为一个人,我可以清楚地看到我不能为1/3写一个正确的值,所以我将用一些数字来解决:0.3333。对于double,我确信我写了double d=0.1。我想如果我把这个加10次,我会得到10,但是我会得到9.9999999999999。我创建了
新的BigDecimal(“0.3333333333333”)
,添加了三个副本,得到了输出0.9999999999999。没关系。你无法用双精度来测量任何真实世界的量。