2013-03-03 5 views
2

У меня есть рядява округление до двух знаков после запятой

double num = 1.234567; 

, и я стараюсь держать только два десятичных знака

num = (int)((num * 100) + 0.5)/100.0; 

но фактическое число, которое я получил, это 1,230000000001. Как я могу избавиться от части 0000000001?

+0

Уверенный литой его способ получения 1,2300 ... 1? Я получаю ответ как 1.23 .. однако, если я не брошу его, я получаю 1.239567 – user1428716

+0

да, я получил кучу нулей и не могу решить проблему – OneZero

+0

может быть, будет разница в ОС - моя 64-битная MAC-ОС .. anyways whats диапазон значений num? – user1428716

ответ

2

Попробуйте DecimalFormat:

DecimalFormat twoDp= new DecimalFormat("#.##"); 
Double.valueOf(twoDp.format(num)); 
+0

Есть ли способ обойти этот объект формата ? – OneZero

+0

попробуйте следующее: MathContext mc = new MathContext (3); // Precision \t BigDecimal b = new BigDecimal (num, mc); \t System.out.println (b.doubleValue()); – user1428716

+0

@ user1428716 Нет ответа, который преобразует значение обратно в плавающую точку, возможно, будет правильным. FP не имеет десятичных знаков. – EJP

0

Попробуйте это .. это должно решить его

 Double num = //value 
    num = //arithmetic 


    String temp =num.toString().split("\\.")[0]; 
     int precision=temp.length(); 
     BigDecimal b =new BigDecimal(num,new MathContext(precision+2)); 
    System.out.println(b.doubleValue()); 
2

Вы не можете, если не перейти к десятичной системе счисления. У двойников и плавающих точек нет десятичных знаков, у них есть бинарные места, поэтому вы не можете округлить их или усечь их до определенного числа десятичных знаков, за исключением случаев, когда представления значений являются конгруэнтными, то есть отрицательные значения 2.

Так вы должны использовать DecimalFormat, если вы представляете результат, или BigDecimal, если вы хотите продолжать вычислять с ним.

Любое решение, которое заканчивается поворотом значения обратно в плавающую точку, неверно.

Смежные вопросы