2013-12-15 47 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