2016-03-12 129 views
2

我重寫了一些科學的代碼,別人寫了一段時間回來,並在整個代碼常數之間的實際差別總是聲明:爪哇 - 2.0和2.00000000000D

final double value = 2.0000000000D; 

用的顯然是任意長度應該是有意義的數字附加到它。我95%確定以這種方式宣佈變量實際上什麼都不做,並且將該值設置爲:

double value = 2.0; 

將完全相同。但是可以肯定的是,我在問這麼一個問題,是否以這種方式聲明一個常量會產生任何(有意義的)區別,或者這可能僅僅是來自另一種語言的遺留物,它可能會有所作爲?

編輯:在回答下面的答案:是的,我問這個問題之前,我確認答案在這個特定的情況下是相同的。也許我應該更具體。是否曾經有過一個實例,我們希望添加額外的「重要」數字實際上會返回不同的數字?我想如果我們得到非常大或非常小的值,而浮點數開始有解決問題的可能性呢?

回答

3

在你的例子中,它沒有區別。您可以驗證這一點像,

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

,輸出

true 

這也是合法的使用double value2 = 2.;

+0

是的,我在問這個問題之前也證實了這一點。也許我應該更具體。是否曾經有過一個例子,我們會認爲事情並非如此? – user1337732

+1

或者只是double值= 2; :) –

+0

'System.out.println(0.05 + 0.05 + 0.05);'Java遵循[IEEE 754](https://en.wikipedia.org/wiki/IEEE_floating_point),有一些數字不能精確表示在二進制中(就像在十進制中,'1/3')。 –

0

嗯,肯定是在遺留代碼一些誤解。

double value=2 

效果很好。

將小數點設置爲零是毫無意義的,並且可能會使用小數點來設置double。例如,

double preciseNumber=3.1415926535897932384626433832795028; 

是bogous:

  • 顯影劑假定雙確實有一個任意的十進制精度 - 但這不是顯影劑假定雙將存儲相同的情況下
  • 十進制數字 - 但事實並非如此,因爲它是以二進制分數而不是十進制分數存儲的。

對於精確計算,請考慮使用BigDecimal(並在字符串中傳遞初始值以確保沒有小數點丟失)。

+0

BigDecimal不再能夠精確表示pi而不是double。 –

+0

好抓:)但你明白了:一旦它有無窮無盡的小數,它可以用BigDecimal精確表示。然而,它很可能成爲一個無限的二進制小數,因此double不能總是正確表示小數。 –

+0

曾經試圖在BigDecimal中精確表示三分之一?你遇到同樣的問題,代表了十分之一的雙倍。 –