Округление с помощью DecimalFormat в Java

давайте рассмотрим следующие операторы в 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. Как?

2 ответов


это преднамеренное поведение. От документация:

округления

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

о ROUND_HALF_EVEN:

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

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

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

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

режим округления по умолчанию DecimalFormat is 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, но если число находится точно между двумя соседями, всегда будет округляться вверх.