2013-12-15 43 views
1

我有谷歌關於如何在java中獲得浮點數的2位小數。以下是我的代碼。最後在這裏float totalWeight = 0.1*levinWeight+0.8*lsmWeight;我得到了可能失去精度的錯誤?我想首先將字符串轉換爲浮點數,然後將其保留爲2位小數。浮點數轉換期間可能出現的精度損失

float levinWeight = Float.parseFloat(dataOnlyCombine[2]); 
float lsmWeight = Float.parseFloat(dataOnlyCombine[3]); 
DecimalFormat df = new DecimalFormat("#.##"); 
levinWeight = Float.valueOf(df.format(levinWeight)); 
lsmWeight = Float.valueOf(df.format(lsmWeight)); 
float totalWeight = 0.1*levinWeight+0.8*lsmWeight; 
+1

不要使用浮動。永遠。除非你有很多人,並且你知道他們能夠以令人滿意的精度代表你所擁有的數字。既然你顯然不知道這一點,這是使用double的一個很好的理由。 – Ingo

回答

4

如果你是關注精度

  • 不使用float,它具有任何可用選項的最低精度。我建議使用doubleBigDecimal
  • 使用操作,涉及值可以準確表示。 0.1 * x會給你錯誤,因爲0.1無法精確表示。使用x/10.0將會有較少的錯誤。

我會寫這樣的事情

double levinWeight = Double.parseDouble(dataOnlyCombine[2]); 
double lsmWeight = Double.parseDouble(dataOnlyCombine[3]); 
double totalWeight = (levinWeight + 8 * lsmWeight)/10.0; 
// perform rounding only at the end as appropriate. 

// to round to two decimal places 
double totalWeight2 = Math.round(totalWeight * 100)/100.0; 
+0

如何獲得2位小數? – user2711681

+0

我正確的在最後得到捨去2的DecimalFormat DecimalFormat df = new DecimalFormat(「#。##」); String totalWeightValue = df.format(totalWeight); – user2711681

+0

@ user2711681這會比使用舍入更復雜也更慢。看我更新的例子。 –

0
float levinWeight = Float.parseFloat(dataOnlyCombine[2]); 
float lsmWeight = Float.parseFloat(dataOnlyCombine[3]); 
float totalWeight = 0.1*levinWeight+0.8*lsmWeight; 
DecimalFormat df = new DecimalFormat("#.##"); 
String totalWeightValue = df.format(totalWeight); 
0

如果你真的想那樣做,然後使用BigDecimal的。這些浮點類對於精度來說是完美的。看看他們:

默認IEEE 746浮點不會滿足您的需求。或者,你可以使用整數和用線穿起來的因素100.所以:

  • 100相當於1.00
  • 452相當於4.52
  • 1相當於0.01