Округление отрицательных чисел в Java
Вопрос
Согласно Википедии округляя отрицательное число, вы округляете абсолютное число. Таким образом, по этой причине -3,5 будет округлено до -4. Но когда я использую java.lang.Math.round (-3.5) возвращает -3. Может кто-нибудь объяснить это?
Другие советы
Существует множество способов округления; тот, на который вы смотрите, называется симметричным арифметическим округлением (как говорится). Раздел, на который вы ссылаетесь: «Этот метод обычно используется в математических приложениях, например, в бухгалтерском учете. Это тот, который обычно преподается на уроках математики начальных классов. & Quot; Похоже, это признает, что это не правило, согласованное на глобальном уровне, а то, которое является наиболее распространенным.
Лично я не помню, чтобы когда-либо учили этому правилу в школе. Мое понимание округления всегда заключалось в том, что .5 округляется, независимо от знака числа. Видимо, авторы Java имеют такое же понимание. Это асимметричное арифметическое округление.
Различные инструменты и языки потенциально используют разные схемы округления. Excel, очевидно, использует симметричный метод.
(В целом, я бы посоветовал, если вы обнаружите конфликт между Википедией и опытом, вы ищете информацию в другом месте. Википедия не идеальна.)
Для чего стоит, java.math.BigDecimal
имеет выбираемые режимы округления, если вам нужен больший контроль над такими вещами.
В статье Википедии, на которую вы ссылаетесь, не говорится, что это единственный способ округления, а просто обычный способ округления. В этой статье также упоминается несколько альтернатив (к сожалению, ни одна из них не описывает метод округления в Java - хотя они и называют его «асимметричным арифметическим округлением» при указании того, что делает JavaScript).
Вам нужно решить, как хотите округлить числа, а затем использовать этот метод. Если реализация Java соответствует этому, то отлично. в противном случае вам нужно будет реализовать это самостоятельно.
По словам Javadocs:
Возвращает ближайший long
к аргументу. Результат округляется до целого числа путем добавления 1/2, взятия минимального значения результата и приведения результата к типу long
. Другими словами, результат равен значению выражения:
(long)Math.floor(a + 0.5d)
Оказывается, соглашение сводится к округлению. Я думаю, что Википедия ошибочна. Оказывается, Microsoft ошиблась, хотя и округлила до -4, что не является соглашением (я проверил с кем-то, кто имеет докторскую степень по математике).