2013-12-15 3 views
1

У меня есть google о том, как получить 2 десятичных числа для числа с плавающей запятой в java. Ниже приведены мои коды. Наконец, здесь float totalWeight = 0.1*levinWeight+0.8*lsmWeight; Я получаю ошибку возможной потери точности? Я хотел бы сначала скрыть строку в float, а затем сделать ее равной 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

Не используйте поплавок. Когда-либо. Если у вас их много, и вы знаете, что они могут представлять цифры, которые у вас есть с удовлетворительной точностью. Поскольку вы, очевидно, не знаете этого, это хорошая причина использовать двойную. – Ingo

ответ

4

Если вы обеспокоенный точностью

  • не использует float, он имеет самую низкую точность любой доступной опции. Я предлагаю использовать операцию double или BigDecimal
  • , которая включает в себя значения, которые могут быть точно представлены. 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 df = new DecimalFormat ("#. ##"); Строка 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
Смежные вопросы