Округление отрицательных чисел в Java - PullRequest
18 голосов
/ 06 ноября 2008

Согласно Википедии при округлении отрицательного числа вы округляете абсолютное число. Таким образом, по этой причине -3,5 будет округлено до -4. Но когда я использую java.lang.Math.round (-3.5) возвращает -3. Может кто-нибудь, пожалуйста, объясните это?

Ответы [ 6 ]

16 голосов
/ 06 ноября 2008

Согласно Javadoc

Возвращает ближайший длинный к аргумент. Результат округляется до целое число, добавив 1/2, принимая пол результата, и приведение результат для типа long. Другими словами, результат равен значению выражение:

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

Концептуально, вы округлите вверх . Другими словами, следующее целое число больше , чем значение, и -3 больше -3,5, а -4 меньше.

8 голосов
/ 06 ноября 2008

Существует множество способов округления; тот, на который вы смотрите, называется симметричным арифметическим округлением (как говорится). Раздел, на который вы ссылаетесь, гласит: «Этот метод часто используется в математических приложениях, например, в бухгалтерском учете. Этот метод обычно преподается на уроках элементарной математики». Кажется, это признает, что это не правило, согласованное на глобальном уровне, а то, которое наиболее распространено.

Лично я не помню, чтобы когда-либо учили этому правилу в школе. Мое понимание округления всегда заключалось в том, что .5 округляется, независимо от знака числа. Видимо, авторы Java имеют такое же понимание. Это асимметричное арифметическое округление.

Различные инструменты и языки потенциально используют разные схемы округления. Excel, очевидно, использует симметричный метод.

(В целом, я бы советовал, что если вы обнаружите конфликт между Википедией и опытом, вы ищете информацию в другом месте. Википедия не идеальна.)

5 голосов
/ 06 ноября 2008

Для чего стоит, <a href="http://java.sun.com/j2se/1.5.0/docs/api/java/math/BigDecimal.html" rel="noreferrer" title="java.math.BigDecimal Javadoc">java.math.BigDecimal</a> имеет выбираемые режимы округления, если вам нужен больший контроль над такими вещами.

4 голосов
/ 06 ноября 2008

В статье про Википедию, которую вы цитируете, не говорится, что это единственный способ округления, просто обычный способ округления. В этой статье также упоминается несколько альтернатив (к сожалению, ни одна из них не описывает метод округления в Java - хотя они и называют его «асимметричным арифметическим округлением» при указании того, что делает JavaScript).

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

2 голосов
/ 06 ноября 2008

Согласно Javadocs:

Возвращает ближайший long к аргументу. Результат округляется до целого числа путем добавления 1/2, взятия минимального значения результата и приведения результата к типу long. Другими словами, результат равен значению выражения:

(long)Math.floor(a + 0.5d)
0 голосов
/ 06 ноября 2008

Оказывается, соглашение сводится к округлению. Я думаю, что Википедия ошибочна. Оказывается, Microsoft ошиблась, хотя и округлила до -4, что не является соглашением (я проверил с кем-то, кто имеет степень доктора наук по математике).

...