2015-03-16 2 views
0

Я хотел бы объединить двойной в java. Я хотел бы, округлый, как это:Java, Round double to two decimal (round to 0.05)

  • 24,04 должен дать 24.05
  • 24.07 должны дать 24,05
  • 24,02 = 24,00
  • 24,08 = 24,10

Я пытаюсь использовать круглые, как это :

amount = amount *10; 
    amount = Math.round(amount)/10; 

Но, как вы можете видеть, это не т работы.

Благодарим за ответы!

+0

Если вы хотите отобразить округленную версию, вам нужно будет отобразить ее как строку. Вы можете использовать правила форматирования для строки, чтобы выполнить то, что вы хотите. –

+0

И что означает 'как вы можете видеть, что это не работает'? Он работает, но он не отображается так, как вы ожидаете, потому что вы не форматируете номер для вывода. –

ответ

2

Math.round(amount * 20)/20f - один способ.

+0

Из-за внутреннего двоичного представления float это может генерировать не округленные значения. –

+0

Действительно. Только двоичные пайки могут быть представлены точно в плавающей точке Java. Но я чувствую, что ОП не спрашивает об этом. При печати можно установить количество знаков после запятой. (Обратите внимание, что именно так работает Excel). BigDecimal несет значительную служебную нагрузку, которая может даже не понадобиться. – Bathsheba

0

Пожалуйста, не то, чтобы округление с использованием float могло генерировать ошибки из-за внутреннего двоичного представления float (то же самое для double). Таким образом, операция типа Math.round(amount * 20)/20f на сумму 23.01 может дать результат 23.000000003 (это пример, который я не проверял, но просто найти проблему, используя несколько тестов).

Использовать BigDecimal вместо.

+0

Проблема в том, что это метод переопределения. поэтому я не могу изменить двойной для BigDecimal! но, спасибо за точность! – tigie11

+0

Кстати, целые числа до 53-й степени из двух могут быть представлены точно в Java double. – Bathsheba

+0

У нас нет целых чисел. У нас есть сумма, которая является числом с плавающей запятой с 2 ​​десятичными значениями. И у нас есть деление на 20. Также для небольших значений с плавающей запятой вы можете иметь ошибки. Например, System.out.println (0,1 - 0,3-0,4 + 0,5); отпечатки -0.09999999999999998 вместо -0.1 –

0

Я хотел бы сделать это следующим образом:

double[] amounts = new double[]{24.04, 24.07, 24.02, 24.08}; 
    for(double d : amounts){ 
     double d2 = Math.round(d * 20)/20.0; 
     System.out.println(String.format("%.2f -> %.2f",d,d2)); 
    } 

Результат таков:

24,04 -> 24,05 
24,07 -> 24,05 
24,02 -> 24,00 
24,08 -> 24,10 

[EDIT] Как другие парни предложили там могут быть некоторые ошибки точности. Это, скорее всего, никогда не будет видно, если вы напечатаете его, как было предложено в моем примере. Но это зависит от того, что вам нужно для номера ....

0

Лично я бы использовал BigDecimal, поскольку это более точно. С этим я думаю, что вам просто нужно использовать умножение на 20, круглые, разделите на 20 трюк, чтобы сделать то, что вы хотите, например:

public class Rounding { 
    private static final BigDecimal TWENTY = new BigDecimal("20"); 

    public static void main(String[] args) { 
     doRounding("24.04"); 
     doRounding("24.07"); 
     doRounding("24.02"); 
     doRounding("24.08"); 
    } 

    private static void doRounding(String s) { 
     BigDecimal d = new BigDecimal(s).multiply(TWENTY).setScale(0, RoundingMode.HALF_UP).divide(TWENTY).setScale(2); 
     System.out.println(s + " -> " + d); 
    } 
} 

... Выходы:

24.04 -> 24.05 
24.07 -> 24.05 
24.02 -> 24.00 
24.08 -> 24.10