2012-04-13 3 views
9

Давайте рассмотрим следующие утверждения в Java.Округление с DecimalFormat в Java

System.out.println(new DecimalFormat("0").format(2.4)); //returns 2 

System.out.println(new DecimalFormat("0").format(2.5)); //returns 2 <---Concentrate here 
System.out.println(Math.round(2.5));     //returns 3 

System.out.println(new DecimalFormat("0").format(2.6)); //returns 3 
System.out.println(new DecimalFormat("0").format(3.5)); //returns 4 

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

System.out.println(new DecimalFormat("0").format(2.5)); 

Она должна возвращать 3, но она возвращает 2. Как?

ответ

9

Это преднамеренное поведение. От the documentation:

Округление

DecimalFormat использует половину даже округления (см ROUND_HALF_EVEN) для форматирования.

О ROUND_HALF_EVEN:

режим округления округлить в сторону «ближайшего соседа», если оба соседи находятся на одинаковом расстоянии, в этом случае, вокруг к даже соседа. Ведет себя как ROUND_HALF_UP, если цифра слева от отброшенной фракции нечетна; ведет себя как ROUND_HALF_DOWN, если он ровный. Обратите внимание, что это режим округления, который минимизирует кумулятивную ошибку при неоднократном применении к последовательности вычислений.

Это также известно как округление банкира.

Math.Round с другой стороны, использует следующую формулу, которая является «нормальным» округления:

(long)Math.floor(a + 0.5d) 
14

округления режим DecimalFormat по умолчанию является RoundingMode.HALF_EVEN. Это означает, что он округляется или округляется, если число приближается к соседнему соседу. Когда число будет точно между двумя соседями (в вашем случае 2 и 3), оно округляется до ближайшего четного числа (в вашем случае 2).

Как вы можете видеть, когда вы пытались его с 3,5, она округляется до 4.

Если вы хотите более «интуитивную» поведение, называют setRoundingMode(RoundingMode.HALF_UP) http://docs.oracle.com/javase/7/docs/api/java/text/DecimalFormat.html#setRoundingMode(java.math.RoundingMode)

это то же самое, как HALF_EVEN, но если число точно совпадает между двумя соседями, оно всегда будет округлено вверх.

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