Округление чисел в microsoft excel

Содержание:

Банковское округление в round()

Очень много идёт дискуссий (pythonworld, stackoverflow, форум linux.org.ru и др.) на тему, какое же всё-таки округление в python арифметическое или банковское (по другому ещё называют Гауссово округление)?

Оказывается в python 2 используется арифметическое округление, а в python 3 — банковское! Спасибо , по какому правилу идёт округление в разных python, благодаря подробному примеру и указанию на авторитетный источник.

Банковское (или бухгалтерское) округление позволяет уменьшить погрешности при работе с большим массивом данных. Обычное (или арифметическое) округление даёт нарастающую погрешность из-за того, что для округления в меньшую сторону на конце должны быть цифры: 1, 2, 3, 4 — всего 4 цифр, а в большую: 5, 6, 7, 8, 9 — всего 5 цифр. Неравное количество цифр при большом количестве вычислений и вызывают нарастающую погрешность.
При банковском округлении осуществляется округление к ближайшему чётному, то есть , . Таким образом вероятность того, что перед пятёркой окажется чётное или нечётное число для большинства случаев (к примеру, бухгалтерские расчёты) примерно одинаковая, поэтому такой принцип уменьшает погрешность.

Здесь вы можете увидеть подробности округления в официальных источниках документации python:

  • Для python 2:
  • Для python 3:

«if two multiples are equally close, rounding is done toward the even choice» (перев.: Округление делается до ближайшего четного) — это и есть банковское округление.

Но напоследок приведу пример, наглядно демонстрирующий разницу работы функции round() в различных версиях python и с учётом неточности представления типа :

Пример round() в python 2 round() в python 3 банковское округление
round(2.05, 1) 2.0 2.0 2.0
round(2.15, 1) 2.1 2.1 2.2
round(2.25, 1) 2.3 2.2 2.2
round(2.35, 1) 2.4 2.4 2.4
round(2.45, 1) 2.5 2.5 2.4
round(2.55, 1) 2.5 2.5 2.6
round(2.65, 1) 2.6 2.6 2.6
round(2.75, 1) 2.8 2.8 2.8
round(2.85, 1) 2.9 2.9 2.8
round(2.95, 1) 3.0 3.0 3.0

Жирным выделил отличающиеся значения выполнения функции round().

Казалось бы в примере с результат для python 3 должен быть , потому как python 3 работает по банковскому округлению, но правильное значение , так как значение в машинном представлении не точное и выглядит для, к примеру, 60 знаков после запятой следующим образом:

>>> '%0.60f' % 2.15
'2.149999999999999911182158029987476766109466552734375000000000'

Отсюда видно, что по правилам обычного арифметического округления получаем .

Но для примера 60 знаков после запятой выглядят следующим образом:

>>> '%0.60f' % 2.25
'2.250000000000000000000000000000000000000000000000000000000000'

Вот здесь-то и возникает спорный момент по способу округления. Так для python 2 получаем  — арифметическое округление.

А для python 3 получаем , что соответствует правилам банковского округления.

Материалы по теме:

Округление (Википедия)

Автор статьи

Права на использование материала, расположенного на этой странице https://vivazzi.pro/it/round-python/:

Разрешается копировать материал с указанием её автора и ссылки на оригинал без использования параметра в теге . Использование:

Автор статьи: Мальцев АртёмСсылка на статью: <a href="https://vivazzi.pro/it/round-python/">https://vivazzi.pro/it/round-python/</a>

Предыдущая статьяПример обработки formset

Следующая статьяsql перенос данных из одной таблицы в другую

Вам нужно саморазвиваться или вы хотите зарабатывать деньги?

Или вы ищите хорошие IT сервисы или книги? Сохраните свое время и взгляните на мою подборку рекомендаций, которыми постоянно пользуюсь.

Посмотреть рекомендации

Ознакомьтесь с реально работающими финансовыми инструментами

Wall Street Cash — Торговый робот на рынке Forex

Ознакомьтесь с роботом (советником), который автоматизирует торговлю на валютном рынке Forex без необходимости самому торговать. Преимущество робота в том, что вы сами контролируете свой счёт, а робот лишь по оптимизированным алгоритмам заключает сделки на куплю и продажу валют.

Подробнее о Wall Street Cash

Viva TM — Доверительное управление с использованием робота WSC

Доверительное управление Viva TM — это разработанный мной сервис по управлению вашими денежными средствами и заработку на рынке Форекс с использованием торгового робота Wall Street Cash.
Возможность использовать моё доверительное управление подходит тем, кто не хочет или не может самостоятельно настроить робота.

Подробнее о Viva TM

Как округлить до целого числа в Excel?

Чтобы округлить до целого в большую сторону используем функцию «ОКРУГЛВВЕРХ». Чтобы округлить до целого в меньшую сторону используем функцию «ОКРУГЛВНИЗ». Функция «ОКРУГЛ» и формата ячеек так же позволяют округлить до целого числа, установив количество разрядов – «0» (см.выше).

В программе Excel для округления до целого числа применяется также функция «ОТБР». Она просто отбрасывает знаки после запятой. По сути, округления не происходит. Формула отсекает цифры до назначенного разряда.

Сравните:

Второй аргумент «0» – функция отсекает до целого числа; «1» – до десятой доли; «2» – до сотой доли и т.д.

Специальная функция Excel, которая вернет только целое число, – «ЦЕЛОЕ». Имеет единственный аргумент – «Число». Можно указать числовое значение либо ссылку на ячейку.

Недостаток использования функции «ЦЕЛОЕ» – округляет только в меньшую сторону.

Округлить до целого в Excel можно с помощью функций «ОКРВВЕРХ» и «ОКРВНИЗ». Округление происходит в большую или меньшую сторону до ближайшего целого числа.

Пример использования функций:

Второй аргумент – указание на разряд, до которого должно произойти округление (10 – до десятков, 100 – до сотен и т.д.).

Округление до ближайшего целого четного выполняет функция «ЧЕТН», до ближайшего нечетного – «НЕЧЕТ».

Пример их использования:

Округление с помощью кнопок на ленте

Самый простой способ изменить округление — это выделить ячейку или группу ячеек и, находясь на вкладке «Главная», нажать на ленте на кнопку «Увеличить разрядность» или «Уменьшить разрядность». Обе кнопки располагаются в блоке инструментов «Число». Будет округляться только отображаемое число, но для вычислений при необходимости будут задействованы до 15 разрядов чисел.

При нажатии на кнопку «Увеличить разрядность» количество внесенных знаков после запятой увеличивается на один.

Кнопка «Уменьшить разрядность», соответственно, уменьшает на одну количество цифр после запятой.

Установка точности расчетов

Если в предыдущих случаях устанавливаемые параметры влияли только на внешнее отображения данных, а при расчетах использовались более точные показатели (до 15 знака), то сейчас мы расскажем, как изменить саму точность расчетов.

  1. Перейдите на вкладку «Файл», оттуда — в раздел «Параметры».

Откроется окно параметров Excel. В этом окне зайдите в подраздел «Дополнительно». Отыщите блок настроек под названием «При пересчете этой книги». Настройки в этом блоке применяются не к одному листу, а к книге в целом, то есть ко всему файлу. Поставьте галочку напротив параметра «Задать точность как на экране» и нажмите «OK».

Теперь при расчете данных будет учитываться отображаемая величина числа на экране, а не та, которая хранится в памяти Excel. Настройку же отображаемого числа можно провести любым из двух способов, о которых мы говорили выше.

Способы записи числа

Представьте, что нам надо записать число 1 миллиард. Самый очевидный путь:

Но в реальной жизни мы обычно опускаем запись множества нулей, так как можно легко ошибиться. Укороченная запись может выглядеть как или для 7 миллиардов 300 миллионов. Такой принцип работает для всех больших чисел.

В JavaScript можно использовать букву , чтобы укоротить запись числа. Она добавляется к числу и заменяет указанное количество нулей:

Другими словами, производит операцию умножения числа на 1 с указанным количеством нулей.

Сейчас давайте запишем что-нибудь очень маленькое. К примеру, 1 микросекунду (одна миллионная секунды):

Записать микросекунду в укороченном виде нам поможет .

Если мы подсчитаем количество нулей , их будет 6. Естественно, верная запись .

Другими словами, отрицательное число после подразумевает деление на 1 с указанным количеством нулей:

Шестнадцатеричные числа широко используются в JavaScript для представления цветов, кодировки символов и многого другого. Естественно, есть короткий стиль записи: , после которого указывается число.

Например:

Не так часто используются двоичные и восьмеричные числа, но они также поддерживаются для двоичных и для восьмеричных:

Есть только 3 системы счисления с такой поддержкой. Для других систем счисления мы рекомендуем использовать функцию (рассмотрим позже в этой главе).

Почему Excel округляет большие числа?

Почти в любом калькуляторе или программе, если вводить слишком большие числа, они округляются до вида E+ и так далее. Excel не является исключением. Почему так происходит?Если число содержит больше 11 цифр, то он автоматически переводится в вид 1,111E+11. Такое представление числа называется экспоненциальным. Образовать такой способ представления вручную довольно сложно. Для этого необходимо вычислить логарифм числа и совершить еще несколько операций.

Если нам не нужно, чтобы Excel осуществлял округление огромных чисел, нам необходимо поставить перед соответствующим значением знак ‘. Предварительно нужно выставить текстовый формат. Но выполнять математические операции без использования специальных формул уже будет нельзя. 

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

Округление вещественных чисел

Как мы уже разбирали, при присваивании переменной типа вещественного числа оно всегда округляется вниз до целого — его дробная часть просто отбрасывается.

А ведь легко можно представить ситуацию, когда дробное число нужно округлить просто до ближайшего целого или вообще вверх. Что делать в этой ситуации?

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

Метод

Метод округляет число до ближайшего целого:

Но, как говорится, есть нюанс: результат работы этого метода — целочисленный тип (не ). Вещественные числа ведь могут быть очень большими, поэтому разработчики Java решили использовать самый большой целочисленный тип, который есть в Java — .

Поэтому чтобы присвоить результат в переменную типа , программист должен явно указать компилятору, что он согласен с возможной потерей данных (вдруг число не поместится в тип ).

Примеры:

Команда Результат

Метод

Метод округляет число до целого вверх, примеры:

Команда Результат

Метод

Метод округляет число до целого вниз, примеры:

Команда Результат

Хотя, для округления числа до целого вниз, будет проще использовать просто оператор приведения типа — :

Команда Результат

Если вам сложно запомнить эти команды, вам поможет небольшой урок английского:

  • — математика
  • — круг/округлять
  • — потолок
  • — пол

Использование функций округления

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

  • ОКРУГЛ – округление до числа с указанным количеством знаков после запятой по правилам математики.
  • ОКРУГЛВВЕРХ – округление до ближайшего большего значения (по модулю).
  • ОКРУГЛВНИЗ – округление до ближайшего меньшего значения (по модулю).
  • ОКРУГЛТ – округление числа с желаемой точностью.
  • ОКРВВЕРХ – округление с избытком до ближайшего числа, которое кратно заданному значению точности.
  • ОКРВНИЗ – округление с недостатком до числа ближайшего числа, которое кратно заданному значению точности.
  • ОТБР – округление до целого числа путем отбрасывания цифр после запятой.
  • ЧЁТН – округление до ближайшего четного числа.
  • НЕЧЁТ – округление до ближайшего нечетного числа.

Обобщенная формула для первых трех функций выглядит так: ФУНКЦИЯ(;). Например, для округления числа 3,14159265 до двух знаков после запятой, нам понадобится следующая формула: =ОКРУГЛ(3,14159265;2).

Пишем ее в нужную ячейку, не забывая в начале поставить знак равно.

После набора формулы щелкаем клавишу Enter и получаем в результате число 3,14.

В формулах функций ОКРУГЛТ, ОКРВВЕРХ и ОКРВНИЗ в качестве второго аргумента указывается кратность округления. Например, если стоит задача округлить число 13 до ближайшего числа, делящегося на 5 без остатка, следует написать следующую формулу: =ОКРУГЛТ(13;5).

Результатом вычисления будет число 15.

Последние три функции (ОТБР, ЧЁТН и НЕЧЁТ) используют всего 1 аргумент – само число или ячейка. Первая из них просто вернет его целую часть, а вторая и третья – ближайшее четное или нечетное числа, соответственно.

Сами функции можно прописать как внутри ячейки, так и в верхней строке формул, которая находится справа от надписи fx.

После того, как вы начнете вводить название функции, программа выдаст подсказки, благодаря которым можно выбрать точное название и избежать возможных опечаток. Перед написанием формулы не забывайте ставить знак равно (“=”).

В дополнение ко всему, есть возможность вызвать функци через вкладку “Формулы”. Откройте ее и выберите “Математические”. Появится список всех функций, расположенных по алфавиту, поэтому для поиска округления (ОКРУГЛ) нужно идти в нижнюю часть списка.

После того, как мы выберем нужную функцию, откроется окно для ее настройки.

В строке “Число” пишем координаты ячейки, значение которой нужно округлить. Также, вместо того, чтобы писать адрес ячейки вручную, можно просто находясь курсором в строке “Число” щелкнуть левой кнопкой мыши по нужной ячейке.

Далее переходим к строке “Число разрядов” и здесь пишем число знаков после запятой. Допустим, в нашем случае, пусть это будет 2.

После того, как все заполнено, нажимаем “OK” и получаем результат в первой строке, куда была вставлена функция округления.

Чтобы применить расчеты к остальным строкам столбца, наводим мышью на нижний правый угол ячейки, содержащей формулу. Курсор поменяет свой вид на небольшой крестик. Теперь, зажав его левой кнопкой мыши тянем формулу на оставшиеся строки, по которым нужно произвести расчет, после чего отпускаем кнопку.

Как округлить до ближайшего целого кратного (функция ОКРУГЛЕНИЕ)

Использование отрицательных значений с указанными выше функциями округления может помочь преобразовать ваши числа в ближайшие кратные 10, 100, 1000 и т. Д. Однако что, если вы хотите преобразовать значения в ближайшее кратное некоторого другого числа, например 2, 3, 15? , так далее.?

В Google Таблицах тоже есть кое-что для этого. Это позволяет вам использовать функцию MROUND. Эта функция работает так же, как функция ROUND, за исключением того, что позволяет округлять значение до ближайшего целого числа, кратного другому значению.

Синтаксис функции MROUND

Синтаксис функции ОКРУГЛ аналогичен синтаксису функции ОКРУГЛ:

MROUND(value, factor)

Здесь,

  • value — это число, которое нужно округлить.
  • factor — это число, до кратного которого значение будет округлено.

В отличие от функций ROUND, ROUNDDOWN и ROUNDUP, вы не можете использовать отрицательные значения во втором параметре функции MROUND, если первый параметр также не является отрицательным числом.

Примеры использования функции MROUND

Давайте посмотрим на несколько примеров, чтобы увидеть, как работает функция MROUND (ОКРУГЛЕНИЕ):

На изображении выше вы увидите, что:

  • В строке 2 функция ОКРУГЛ. Округляет значение 213,142 до ближайшего кратного 2 . Итак, получаем результат 214 .
  • Точно так же в строке 9 функция ОКРУГЛ. Округляет значение 565,142 до ближайшего числа, кратного 15 . Итак, получаем результат 570 .

В этом уроке мы показали вам, как округлять числа в Google Таблицах с помощью четырех различных функций округления в Google Таблицах. К ним относятся функции ROUND, ROUNDUP, ROUNDDOWN и MROUND.

Функция ROUND может помочь вам округлить значения в соответствии со стандартными правилами, а функция ROUNDUP гарантирует, что ваши значения всегда округляются в большую сторону. Точно так же функция ROUNDDOWN гарантирует, что ваши значения всегда округляются в меньшую сторону. С другой стороны, функция MROUND позволяет округлять значения до кратных некоторому целому числу.

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

Мы надеемся, что это руководство помогло вам понять различия между каждой из функций округления и то, как лучше всего использовать их в Google Таблицах.

Округление чисел с плавающей запятой с помощью DoubleRounder

DoubleRounder — это утилита из библиотеки decimal4j. Она предоставляет быстрый метод округления double чисел до 18 знаков после запятой.

Последнюю версию библиотеки можно найти здесь. Чтобы подключить ее, добавьте зависимость в файл pom.xml:

<dependency>
    <groupId>org.decimal4j</groupId>
    <artifactId>decimal4j</artifactId>
    <version>1.0.3</version>
</dependency>

Пример использования утилиты:

DoubleRounder.round(PI, 3);

Но DoubleRounder дает сбой в нескольких сценариях. Например:

System.out.println(DoubleRounder.round(256.025d, 2));
// OUTPUTS: 256.02 вместо ожидаемого 256.03

Как грамотно округлить число в Excel

В нашем случае округление было осуществлено в сторону увеличения. Это зависит от числа, которое убирается. Если перед нужным значением находится 5 или больше, то округление осуществляется в направлении увеличения, а если меньше – уменьшения. Все так, как нужно делать в математике, никаких изменений в правилах нет.

Точность результата зависит от того, сколько знаков в дробной части человек решил оставить. Чем оно больше, тем выше точность. Поэтому настоятельно рекомендуется выполнять округление значений лишь в тех ситуациях, когда в этом есть реальная практическая необходимость. Иногда даже малейшее округление может абсолютно исказить расчеты. Это, кстати, одна из наиболее распространенных причин, почему так часто синоптики ошибаются. Даже был открыт эффект бабочки, когда из-за незначительных различий между округленным значением и настоящим был спрогнозирован дождливый сезон.

Формат чисел через контекстное меню

Нужную степень отображаемого на экране округления можно изменить и другим способом – через контекстное меню ячейки.

  1. Выделяем нужную ячейку (или область, состоящую из нескольких ячеек) и кликаем по ней правой кнопкой мыши. В контекстном меню выбираем пункт “Формат ячеек…”.
  2. Откроется окно, в котором в верхнем меню переходим во вкладку “Число” (по умолчанию должна быть установлена именно эта вкладка). В списке слева выбираем “Числовой” формат. Справа находим надпись “Число десятичных знаков”, рядом с которым есть текстовое поле для выбора количества знаков дробной части. Можно ввести его самостоятельно или дойти до нужного значения путем нажатия на стрелки вверх или вниз.
  3. Далее нажимаем на “ОК”, после чего изменения вступят в силу.

Примечание: Также можно поставить галочку напротив надписи “Разделитель групп разрядов”, чтобы при отображении больших чисел разграничить группы разрядов.

Функции округления чисел в Excel

При работе с функциями в Excel, Вы наверно замечали набор функций ОКРУГЛ(), ОКРВВЕРХ(), ОКРВНИЗ(), ОКРУГЛВВЕРХ(), ОКРУГЛВНИЗ() категории «Математические». В чем отличия между этими функциями и как они работают?

Ранее, в статье «Формат данных в Excel», я описывал форматы представления данных в Excel. С помощью представления можно добавить или сократить дробную часть числа, но фактический формат числа остается неизменным. Часто, при делении чисел, дробная часть получается очень длинной, что в дальнейшем может мешать при некоторых расчетах и выдавать результат не тот, который ожидался. Для того чтобы сократить дробную часть числа (округлить), используется функция ОКРУГЛ(), в которой можно указать необходимое число разрядов после запятой. Также возможно округление и целой части.

Округление происходит следующим образом: -Если число меньше 5, то следующий разряд остается неизменным. -Если число равно или больше 5, то к следующему разряду добавляется единица.

Например, число 2553,5675643 после округления до сотых будет выглядеть 2553,57 В общем, округление по школьной программе

Теперь рассмотрим как работает функция ОКРУГЛ() и какие имеет аргументы.

Синтаксис функции прост — ОКРУГЛ(Число; Число разрядов).

  • Число – в этом аргументе указывается ссылка на ячейку с числом, которое необходимо округлить или вводите значение. Допускает использование других функции, результатом которых является число.
  • Число разрядов — значение этого аргумента указывает, до какого разряда необходимо округлить число. При указании в этом аргументе положительного числа, округление будет происходить после запятой. При нуле, округление до целой части. При указании отрицательного аргумента, округляется целая часть. При этом, кол-во разрядов в целой части, сохраняется и заполняется нулями.

Пример: Округлим число 2553,5675643 Запись функции следующая:

«=ОКРУГЛ(2553,5675643;2)» вернет результат 2553,57 «=ОКРУГЛ(2553,5675643;0)» вернет 2554 «=ОКРУГЛ(2553,5675643;-2)» вернет 2600

В Excel так же есть функции ОКРВВЕРХ(), ОКРВНИЗ(), ОКРУГЛВВЕРХ(), ОКРУГЛВНИЗ(). Все эти функции практически аналогичны работе с функцией ОКРУГЛ(), но у каждой из них немного иной алгоритм округления.

Функция: ОКРВВЕРХ() — функция округляет число до ближайшего целого, которое кратно числу, указанного в аргументе «точность«. Округление происходит в большую сторону.

Примеры: «=ОКРВВЕРХ(2553,57;1)», результат 2554 «=ОКРВВЕРХ(2553,57;3)», вернет результат кратный 3 т.е. 2556

Для округления отрицательных чисел, аргумент «точность» должен быть также отрицательным, иначе функция вернет ошибку «#ЧИСЛО!» «=ОКРВВЕРХ(-2553,57;-2)», результат -2554

И еще один пример округления, но уже дробного числа «=ОКРВВЕРХ(0,578;0,02)» результат 0,58

ОКРВНИЗ() — функция аналогична ОКРВВЕРХ(), с той лишь разницей что округление происходит в меньшую сторону. «=ОКРВНИЗ(2553,57;2)» результат 2552

ОКРУГЛВВЕРХ(), ОКРУГЛВНИЗ() — функции по принципу работы схожи с функцией ОКРУГЛ(). Отличие в том, что эти функции округляют число с избытком(недостатком).

Примеры: «=ОКРУГЛВВЕРХ(2553,34;1)», результат получится 2553,4 «=ОКРУГЛВВЕРХ(2553,34;-1)», результат 2560 «=ОКРУГЛВНИЗ(2553,34;1)», результат 2553,3 «=ОКРУГЛВНИЗ(2553,34;-1)», результат 2550

Метод Math.round() java

При использовании метода Math.round() можно контролировать п-количество десятичных разрядов путем умножения и деления на 10^п :

public static double roundAvoid(double value, int places) {
    double scale = Math.pow(10, places);
    return Math.round(value * scale) / scale;
}

Этот метод не рекомендуется использовать для округления чисел, поскольку он усекает значение. Во многих случаях значения округляются неправильно:

System.out.println(roundAvoid(1000.0d, 17));
// Вывод: 92.23372036854776 !!
System.out.println(roundAvoid(260.775d, 2));
// Вывод: 260.77 вместо ожидаемого 260.78

Встроенные функции

Для операции округления в Python есть встроенные функции – и

round

– округляет число (number) до ndigits знаков после запятой. Это стандартная функция, которая для выполнения не требует подключения модуля math.

По умолчанию операция проводится до нуля знаков – до ближайшего целого числа. Например:

Чтобы получить целый показатель, результат преобразовывают в .

Синтаксически функция вызывается двумя способами.

  1. – это округление числа до целого, которое расположено ближе всего. Если дробная часть равна 0,5, то округляют до ближайшего четного значения.
  2. – данные округляют до знаков после точки. Если округление проходит до сотых, то равен «2», если до тысячных – «3» и т.д.

int

– встроенная функция, не требующая подключения дополнительных модулей. Её функция – преобразование действительных значений к целому путем округления в сторону нуля. Например

Для положительных чисел функция аналогична функции , а для отрицательных – аналогично . Например:

Чтобы число по int преобразовать по математическим правилам, нужно выполнить следующие действия.

  1. Если число положительное, добавить к нему 0,5.
  2. Если число отрицательное, добавить -0,5.

Синтаксически преобразование оформляется так:

Методы

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

  • Округление к ближайшему целому (англ. rounding) — наиболее часто используемое округление, при котором число округляется до целого, модуль разности с которым у этого числа минимален. В общем случае, когда число в десятичной системе округляют до N-го знака, правило может быть сформулировано следующим образом:

    • если N+1 знак < 5, то N-й знак сохраняют, а N+1 и все последующие обнуляют;
    • если N+1 знак ≥ 5, то N-й знак увеличивают на единицу, а N+1 и все последующие обнуляют;
    Например: 11,9 → 12; −0,9 → −1; −1,1 → −1; 2,5 → 3.
    Максимальная дополнительная абсолютная погрешность, вносимая при таком округлении (погрешность округления), составляет ±0,5 последнего сохраняемого разряда.
  • Округление к меньшему по модулю (округление к нулю, целое англ. fix, truncate, integer) — самое «простое» округление, поскольку после обнуления «лишних» знаков предшествующий знак сохраняют, то есть технически оно состоит в отбрасывании лишних знаков. Например, 11,9 → 11; −0,9 → 0; −1,1 → −1). При таком округлении может вноситься погрешность в пределах единицы последнего сохраняемого разряда, причём в положительной части числовой оси погрешность всегда отрицательна, а в отрицательной — положительна.
  • Округление к большему (округление к +∞, округление вверх, англ. ceiling — досл. «потолок») — если обнуляемые знаки не равны нулю, предшествующий знак увеличивают на единицу, если число положительное, или сохраняют, если число отрицательное. В экономическом жаргоне — округление в пользу продавца, кредитора (лица, получающего деньги). В частности, 2,6 → 3, −2,6 → −2. Погрешность округления — в пределах +1 последнего сохраняемого разряда.
  • Округление к меньшему (округление к −∞, округление вниз, англ. floor — досл. «пол») — если обнуляемые знаки не равны нулю, предшествующий знак сохраняют, если число положительное, или увеличивают на единицу, если число отрицательное. В экономическом жаргоне — округление в пользу покупателя, дебитора (лица, отдающего деньги). Здесь 2,6 → 2, −2,6 → −3. Погрешность округления — в пределах −1 последнего сохраняемого разряда.
  • Округление к большему по модулю (округление к бесконечности, округление от нуля) — относительно редко используемая форма округления. Если обнуляемые знаки не равны нулю, предшествующий знак увеличивают на единицу. Погрешность округления составляет +1 последнего разряда для положительных и −1 последнего разряда для отрицательных чисел.

Round() в Go 1.10

Для тех, кто не знаком с устройством float (я в их числе), этот код выглядит совершенно непонятно. Попробуем разобраться, что же он делает:

Похоже, что мы берём битовое представление числа, сдвигаем его и применяем маску. Согласно :

Рассматривая приведённые выше константы, мы видим, что сдвиг составляет 64 — 11 — 1, что означает 64 бита на число, 11 из которых используются для показателя степени, один — для знака и 52 оставшихся бита — для мантиссы. Это означает, что используемый сдвиг удаляет биты мантиссы, а маска удаляет бит знака, оставляя нас только с показателем степени.

В полученном числе показатель степени записан не как он есть, а с прибавлением числа 1023 (это делается для того чтобы записывать отрицательные показатели для очень маленьких чисел), что означает, что мы должны вычесть 1023 из e, вычисленного выше, чтобы получить фактический показатель. Иными словами, если e < bias, то мы имеем отрицательный показатель степени, что означает, что абсолютное значение float должно быть < 1. Действительно, дальше мы видим:

Здесь бит маскируется знаковым битом, это используется только для сохранения правильного знака: теперь мы можем полностью игнорировать мантиссу. Мы можем это сделать, потому что в этом случае нас интересует только показатель степени. Так как используется основание степени 2, а e < bias, мы знаем, что наименьший показатель, который может быть, равен -1, а 2 ^ -1 = 0,5. Кроме того, мантисса имеет некоторое значение 1.X. Таким образом, в зависимости от показателя наше число находится либо в диапазоне (0,5, 1), либо в диапазоне (0, 0,5). Поэтому во втором случае для правильного округления нам нужно добавить к числу единицу. Фух. Подробнее это описано в википедии.

Теперь разберём второй случай:

Наверное, вы думаете, что условие в этой ветке должно быть e > bias, чтобы покрыть все случаи с положительным показателем степени. Но вместо этого тут используется только их часть. Использование сдвига здесь особенно интересно, потому что кажется, что оно несравнимо с bias. Первое — это число битов смещения, а второе — численное смещение. Но, поскольку числа с плавающей точкой представлены как (1.мантисса) * 2 ^ X, то если X больше числа битов в мантиссе, мы гарантированно получим значение без дробной части. То есть показатель степени сместил десятичную точку вправо настолько, что мантисса окончательно пропала. Таким образом, выражение в этой ветке игнорирует числа с плавающей точкой, которые уже округлены.

Первая строка тут простая: вычитаем bias из e и получаем реальное значение показателя степени. Вторая строка добавляет к значению 0,5. Это работает, потому что старший бит мантиссы добавляет 0,5 к финальной сумме (см. представление в статье “Википедии” ниже). В этом случае эта сумма переполняет 52-битные границы мантиссы, показатель степени будет увеличен на 1. Значение показателя степени не сможет переполниться до знакового бита, так как оно не может быть больше bias+shift из примера выше. В любом случае, дробная часть очищается. Таким образом, если дробная часть была больше или равна 0,5, она будет увеличена на 1, в противном случае будет отброшена. Хитро и не очевидно до тех пор, пока мы не посмотрим глубже.

Округление в большую сторону до ближайшего целого числа

Если вы хотите округлить десятичные числа вверх, используйте Math.ceil. Действие этого метода также можно представить, как бесконечный лифт: Math.ceil всегда везет вас «вверх«, независимо от того, является ли число отрицательным или положительным:

Math.ceil(42.23);
> 43
Math.ceil(36.93);
> 37 
Math.ceil(-36.93); -36

Округление до ближайшего кратного числа

Если нужно округлить значение до ближайшего числа, кратного 5, создайте функцию, которая делит число на 5, округляет его, а затем умножает результат на то же значение:

function roundTo5(num) {
    return Math.round(num/5)*5;
}

Использование:

roundTo5(11);
> 10

Если нужно выполнить JavaScript округление до двух знаков, можно передавать функции, как начальное число, так и кратность:

function roundToMultiple(num, multiple) {
    return Math.round(num/multiple)*multiple;
}

Чтобы использовать функцию, включите в ее вызов округляемое число и кратность:

var initialNumber = 11;
var multiple = 10;
roundToMultiple(initialNumber, multiple);
> 10;

Чтобы округлять значения только в большую или меньшую сторону замените в функции round на ceil или floor.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Adblock
detector