2016-10-07 182 views
0

我有點困惑,因爲我一直失去精度。雙精度丟失

也許我操作的類型不對。我有一個像「100.00」的字符串。但是當我做

Double.parseDouble(「100.00」)它被切斷爲100.需要幫助。提前致謝。

+10

這不會損失精度。這只是格式不同。 – Kayaman

+3

它可能沒有被切斷,但在打印時被忽略,因爲它不會添加信息。除此之外,正如Kayaman已經指出的那樣,這不是精確度的損失。精確度的損失可能類似於161.0 * 0.7 = 112.69999,而不是112.7。 – Thomas

+1

在二進制文件中,你認爲'100'和'100.00'之間的區別是什麼? –

回答

4

您可能已打印您的電話號碼System.out.println(d)。它將在內部呼叫Double.toString(double),其規格狀態爲

必須爲m或a的小數部分打印多少位數?必須至少有一位數字來表示小數部分,並且除此之外還需要多少位數,但只需要多少位數來唯一地區分參數值和類型爲double的相鄰值。

這是因爲double數字沒有「小數精度」的概念。它是一個二進制數字與固定二進制精度(二進制點後的二進制數字的數量)。

+0

在PostGreSql數據庫中,它被保存爲「100」而不是「100.00」 – Moonstar

+0

在什麼類型的字段中?因爲如果它不是字符串字段,則100和100.00之間的差異不是實數,因爲它們是相同實數的兩個表示。 –

+0

我明白了。謝謝。是的,字符串表示必須改變... – Moonstar

0

只需使用BigDecimal的,而不是雙這樣的:不是在所有

BigDecimal houndred = new BigDecimal("100.00").setScale(2, BigDecimal.ROUND_HALF_UP); 

的BigDecimal不鬆動的精度。另外,您可以根據自己的喜好設置比例,精度和舍入模式。