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