Округление отрицательных чисел в Java

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

Ответ 1

В соответствии с javadoc

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

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

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

Ответ 2

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

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

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

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

Ответ 3

Для того, что стоит, java.math.BigDecimal имеет настраиваемые режимы округления, если вам нужно больше контролировать такие вещи.

Ответ 4

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

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

Ответ 5

Согласно Javadocs:

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

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

Ответ 6

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