2015-04-05 3 views
0

Я прочитал этот вопрос Round a double to 2 decimal places Он показывает, как округлить число. Я хочу просто форматировать, печатать только два десятичных знака. Что у меня есть и то, что я пробовал:Как форматировать двойной ввод в Java без округления?

double res = 24.695999999999998; 
DecimalFormat df = new DecimalFormat("####0.00"); 
System.out.println("Value: " + df.format(res)); //prints 24.70 and I want 24.69 
System.out.println("Total: " + String.format("%.2f", res)); //prints 24.70 

Так что, когда у меня есть 24.695999999999998 я хочу, чтобы отформатировать его как 24.69

+0

Ищете [Math.floor (двойной)] (http://docs.oracle.com/javase/7/docs/ api/java/lang/Math.html # floor% 28double% 29) возможно? – OldCurmudgeon

+1

Если вы представляете валюту, как бы вы ее не заметили, не могли бы вы вместо этого использовать 'long' и представлять точное значение (в гроши), а не прибегать к« двойному »и переносить с ошибкой маржу, вызванную плавающей точечные операции? – Bobulous

ответ

4

Вы должны принять floor двойного значения первого - отформатируйте его.

Math.floor(double)

Возвращает наибольшее (ближайшее к положительной бесконечности) двойное значение, которое меньше или равно аргумента и равно математическому целому числу.

Так использовать что-то вроде:

double v = Math.floor(res * 100)/100.0; 

Других альтернатив включают в себя использование BigDecimal.

public void test() { 
    double d = 0.29; 
    System.out.println("d=" + d); 
    System.out.println("floor(d*100)/100=" + Math.floor(d * 100)/100); 
    System.out.println("BigDecimal d=" + BigDecimal.valueOf(d).movePointRight(2).round(MathContext.UNLIMITED).movePointLeft(2)); 
} 

печатает

d=0.29 
floor(d*100)/100=0.28 
BigDecimal d=0.29 
+0

Это может дать неожиданные результаты. Например, ближайшая двойная до 0,29 имеет точное значение 0,289999999999999980015985556747182272374629974365234375, которое усекает до 0,28. –

2

В дополнение к использованию Math.floor(double) и расчета шкалы (например * 100, а затем / 100.0 для двух знаков после запятой), вы можете использовать BigDecimal, то вы можете вызвать setScale(int, int) как

double res = 24.695999999999998; 
BigDecimal bd = BigDecimal.valueOf(res); 
bd = bd.setScale(2, RoundingMode.DOWN); 
System.out.println("Value: " + bd); 

Который также предоставит вам (запрошенное)

Value: 24.69 
+0

Эй @ Elliott Frisch это не работает с 24.699999999999999, он преобразует его в 24.70. Но даже с одним менее «9» он преобразуется правильно. Конечно, вряд ли будет так много «9» в конце, но, тем не менее, просто FYI. – Gunhan

0

Умножьте число на 100 и произведите его на целое число. Это отсекает все десятичные пробелы, кроме двух, которые вы хотите. Разделите результат на 100.00. (24.69).

int temp = (int)(res * 100); 
double result = temp/100.00; 

или же в одной строке кода:

double result = ((int)(res * 100))/100.00; 
+0

Объясните код, который это помогает. –

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