2016-11-14 7 views
0

Я использую Java 7, и я просто хочу, чтобы округлить значения до 2 знаков после запятой, образец кода также дается от различных StackOverflow ссылок:округления значения до 2 знаков после запятой в Java

Double d1= 4.37 ,  d2=0.694444444; //expected result after multiplication of numbers d1 and d2 is 3.04 
DecimalFormat df = new DecimalFormat("#.#####"); 
     String str = df.format(d1*d2); 
     d=(Double)df.parse(str); 
     System.out.println(d);//Prints 3.03472 
     df = new DecimalFormat("#.####"); 
     str = df.format(d); 
     d= (Double)df.parse(str); 
     System.out.println(d);//Prints 3.0347 
     df = new DecimalFormat("#.###"); 
     str = df.format(d); 
     d= (Double)df.parse(str); 
     System.out.println(d);//Prints 3.035 
     df = new DecimalFormat("#.##"); 
     str = df.format(d); 
     d= (Double)df.parse(str); 
     System.out.println(d); //Prints my desired result 3.04 

Является ли это не возможно сделать это в 2 или 3 заявлениях.

С уважением

Kris

+0

lol, it's java. для большинства вещей требуется не менее 10 строк кода –

+1

Почему бы не оставить десятичное разрешение как есть, и нам 'System.out.println (String.format ("%. 2f ", d))' когда вы хотите вывести. –

+0

@HaleemurAli: Я хочу присвоить свой окончательный результат 3.04 двойной переменной, чтобы сохранить ее в базе данных. С уважением, Kris – chiku

ответ

1

Проблема заключается в том, что ожидаемый результат 3,04 не имеет смысла, если вы округлить до ближайшего значения оно должно быть 3,03. Результат 4,37 * 0.694444444 является +3,03472222028 и что ближе к 3,03 затем 3,04:

abs 3.03472222028 - 3.03 = 0.00472222028 
abs 3.03472222028 - 3.04 = 0.00527777972 

Так на самом деле все, что вам нужно, это

new DecimalFormat("#.##"); 

Но, как говорит Klitos, вы, вероятно, хотите, чтобы сохранить действительное значение как можно дольше, и только раунд, если вам нужно сохранить его в базе данных. Где вы могли бы использовать

String.format("%.2f", value) 

Обновление 17/11

В примере вы предоставили:

DecimalFormat df = new DecimalFormat("#.##"); 
    String result = df.format(10.85*1/1.44); 

В результате 7,53 (правильный). Однако, с вашим кодом, результат 7.54, что неверно.

Это связано с тем, что вы последовательно округлите каждую цифру и скопируйте ошибки, что приведет к ошибке округления, как показано в примере, который вы указали.

Так что вам действительно не нужно писать свой собственный алгоритм округления. Вы можете просто использовать значение по умолчанию от new DecimalFormat("#.##").

+0

Я пишу небольшую программу java для извлечения значений округления округления и сбрасывания в db, данные образца приведены так: Доход, Fx Rate (1/1.44), Фактический, Calc, Diff, (Доход * Fx Rate) 10.85, 0.694444444, 7.53, 7.54, -0.009999999999999787, 7.5347222174 // WRONG 10.98, 0.694444444, 7.63, 7.63, 0.0, 7.62499999512 // ACCORTATE С уважением, kris – chiku

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