Округление в python

Эмпирические правила арифметики с округлениями

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

Все исходные значения округляются до реальной точности измерений и записываются с соответствующим числом значащих цифр, так, чтобы в десятичной записи все цифры были надёжными (допускается, чтобы последняя цифра была сомнительной). При необходимости значения записываются со значащими правыми нулями, чтобы в записи указывалось реальное число надёжных знаков (например, если длина в 1 м реально измерена с точностью до сантиметров, записывается «1,00 м», чтобы было видно, что в записи надёжны два знака после запятой), или точность явно указывается (например, 2500±5 м — здесь надёжными являются только десятки, до них и следует округлять).
Промежуточные значения округляются с одной «запасной» цифрой.
При сложении и вычитании результат округляется до последнего десятичного знака наименее точного из параметров (например, при вычислении значения 1,00 м + 1,5 м + 0,075 м результат округляется до десятых метра, то есть до 2,6 м). При этом рекомендуется выполнять вычисления в таком порядке, чтобы избегать вычитания близких по величине чисел и производить действия над числами по возможности в порядке возрастания их модулей.
При умножении и делении результат округляется до наименьшего числа значащих цифр, которое имеют множители или делимое и делитель

Например, если тело при равномерном движении прошло дистанцию 2,5⋅103 метров за 635 секунд, то при вычислении скорости результат должен быть округлён до 3,9 м/с, поскольку одно из чисел (расстояние) известно лишь с точностью до двух значащих цифр.

Важное замечание: если один операндов при умножении или делитель при делении является по смыслу целым числом (то есть не результатом измерений непрерывной физической величины с точностью до целых единиц, а, например, количеством или просто целой константой), то количество значащих цифр в нём на точность результата операции не влияет, и оставляемое число цифр определяется только вторым операндом. Например, кинетическая энергия тела массой 0,325 кг, движущегося со скоростью 5,2 м/с, равна Ek=mv22=0.325⋅5.222=4.394≈4.4{\displaystyle E_{k}={\tfrac {mv^{2}}{2}}={\tfrac {0.325\cdot 5.2^{2}}{2}}=4.394\approx 4.4} Дж — округляется до двух знаков (по количеству значащих цифр в значении скорости), а не до одного (делитель 2 в формуле), так как значение 2 по смыслу — целая константа формулы, она является абсолютно точной и не влияет на точность вычислений (формально такой операнд можно считать «измеренным с бесконечным числом значащих цифр»).

При возведении в степень в результате вычисления следует оставлять столько значащих цифр, сколько их имеет основание степени.
При извлечении корня любой степени из приближённого числа в результате следует брать столько значащих цифр, сколько их имеет подкоренное число.
При вычислении значения функции f(x){\displaystyle f\left(x\right)} требуется оценить значение модуля производной этой функции в окрестности точки вычисления

Если |f′(x)|⩽1{\displaystyle \left|f’\left(x\right)\right|\leqslant 1}, то результат функции точен до того же десятичного разряда, что и аргумент. В противном случае результат содержит меньше точных десятичных разрядов на величину log10⁡(|f′(x)|){\displaystyle \log _{10}\left(\left|f’\left(x\right)\right|\right)}, округлённую до целого в большую сторону.

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

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

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

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

Сравните:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Варианты округления 0,5 к ближайшему целому

Отдельного описания требуют правила округления для специального случая, когда (N+1)-й знак = 5, а последующие знаки равны нулю. Если во всех остальных случаях округление до ближайшего целого обеспечивает меньшую погрешность округления, то данный частный случай характерен тем, что для однократного округления формально безразлично, производить его «вверх» или «вниз» — в обоих случаях вносится погрешность ровно в 1/2 младшего разряда. Существуют следующие варианты правила округления до ближайшего целого для данного случая:

  • Математическое округление — округление всегда в бо́льшую по модулю сторону (предыдущий разряд всегда увеличивается на единицу).
  • Банковское округление (англ. banker’s rounding) — округление для этого случая происходит к ближайшему чётному, то есть 2,5 → 2; 3,5 → 4.
  • Случайное округление — округление происходит в меньшую или большую сторону в случайном порядке, но с равной вероятностью (может использоваться в статистике). Также часто используется округление с неравными вероятностями (вероятность округления вверх равна дробной части), этот способ делает накопление ошибок случайной величиной с нулевым математическим ожиданием.
  • Чередующееся округление — округление происходит в меньшую или большую сторону поочерёдно.

Во всех вариантах в случае, когда (N+1)-й знак не равен 5 или последующие знаки не равны нулю, округление происходит по обычным правилам: 2,49 → 2; 2,51 → 3.

Математическое округление просто формально соответствует общему правилу округления (см. выше). Его недостатком является то, что при округлении большого числа значений, которые далее будут обрабатываться совместно, может происходить накопление ошибки округления. Типичный пример: округление до целых рублей денежных сумм, выражаемых в рублях и копейках. В реестре из 10 000 строк (если считать копеечную часть каждой суммы случайным числом с равномерным распределением, что обычно вполне допустимо) окажется в среднем около 100 строк с суммами, содержащими в части копеек значение 50. При округлении всех таких строк по правилам математического округления «вверх» сумма «итого» по округлённому реестру окажется на 50 рублей больше точной.

Три остальных варианта как раз и придуманы для того, чтобы уменьшить общую погрешность суммы при округлении большого количества значений. Округление «до ближайшего чётного» исходит из предположения, что при большом числе округляемых значений, имеющих 0,5 в округляемом остатке, в среднем половина из них окажется слева, а половина — справа от ближайшего чётного, таким образом, ошибки округления взаимно погасятся. Строго говоря, предположение это верно лишь тогда, когда набор округляемых чисел обладает свойствами случайного ряда, что обычно верно в бухгалтерских приложениях, где речь идёт о ценах, суммах на счетах и так далее. Если же предположение будет нарушено, то и округление «до чётного» может приводить к систематическим ошибкам. Для таких случаев лучше работают два следующих метода.

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

  • Округление в случайную сторону требует для каждой округляемой строки генерировать случайное число. При использовании псевдослучайных чисел, создаваемых линейным реккурентным методом, для генерации каждого числа требуется операция умножения, сложения и деления по модулю, что для больших объёмов данных может существенно замедлить расчёты.
  • Чередующееся округление требует хранить флаг, показывающий, в какую сторону последний раз округлялось специальное значение, и при каждой операции переключать значение этого флага.

Выбор способа округления

Существует несколько способов округления в зависимости от способа применения результата: округление к меньшему/ большему, округление к меньшему/ большему по модулю, округление к ближайшему целому, округление к ближайшему чётному и т. д… Округление к ближайшему целому, в свою очередь, можно делать по-разному в зависимости от того, какой результат должен получиться, если дробная часть равна 0,5. Я буду рассматривать округление к ближайшему целому, причём 0,5 будет округляться в большую (по модулю) сторону.

Требования к корректной реализации Round() заключаются в следующем:

  • правильно округляет до ближайшего целого все конечные числа;
  • поддерживает специальные значения (NaN, Inf, -0), возвращая их без изменений.

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

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

Обратите внимание, что, поскольку мы используем float, мы не можем использовать число 0,49999999999999999 в качестве ближайшего к 0,5, так как из-за ограниченной точности float это число в точности равно 0,5. Вместо этого я использую 0,49999999999999994

Реализации, предложенные в закрытом тикете, явно не были проверены на подобных данных, часто не работали даже те из них, которые были предложены известными людьми. Это лишний раз доказывает, насколько сложно написать Round().

int(f + 0.5)

Первая реализация, предложенная rsc, выглядела следующим образом:

Она некорректно работает с особыми значениями, отрицательными числами, числами больше math.MaxInt64 и числами, близкими к 0,5:

Floor() or Ceil()

Второй предложенный вариант учитывал отрицательные числа:

однако продолжал некорректно работать в некоторых случаях:

Первые два теста не проходят, потому что результат разности n — 0,5 равен в точности -1,0, тогда как мы ожидаем получить что-то точно большее, чем -1,0. Если посмотреть на , можно понять, как решить эту проблему.

Самое интересное, что эта ошибка не является такой уж редкой. До версии 6 точно такая же присутствовала в Java. Хорошо, что с тех пор реализация улучшилась.

int и Copysign

В третьем предложении от minux была предпринята другая попытка решить проблему отрицательных чисел:

И этот вариант всё равно ломает тесты:

Как видно, часть тестов стала проходить, однако другие начали падать. Была предпринята попытка улучшить этот алгоритм:

Однако и она провалилась:

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

Мы рассмотрели уже четыре варианта, и в каждом из них нашлись изъяны. Настало время посмотреть, как Round() реализуют авторы различных пакетов.

Kubernetes

Kubernetes 1.7 содержит реализацию:

Она ломает следующие тесты:

Судя по тому, что функция возвращает int32, она не предназначена для работы с большими числами. Однако она некорректно работает и с числами, которые близки к 0,5.

Как округлить с помощью функции Excel?

А теперь перейдем непосредственно к практике. Что нужно делать, чтобы осуществить округление чисел с помощью функции? Для этого существует специальная функция ОКРУГЛ. Ее можно вызвать разными способами: через ленту в Excel 2007 версии и более новые.

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

Наиболее простой для новичка метод – воспользоваться мастером функций. Чтобы это сделать, нужно найти возле строки ввода формулы кнопочку, на которой написана комбинация маленьких буковок fx. Найти эту функцию можно в разделе «Математические», и после ее выбора будет предложено ввести аргументы. Каждый из них подписан, поэтому разобраться несложно.

Синтаксис функции ОКРУГЛ

Если используется ручной ввод, то нужно понимать, как правильно записывать формулу. Последовательность ввода значений называется синтаксисом. Любая функция имеет универсальный общий синтаксис. Сначала записывается знак равно, потом название функции, потом аргументы, которые прописываются в скобках, а разделяются между собой запятой. Количество аргументов может отличаться от функции к функции. В некоторых их вообще нет, а в ряде из них их хоть 5, хоть больше. 

В случае с функцией ОКРУГЛ их два. Давайте рассмотрим их более подробно.

Аргументы функции ОКРУГЛ

Итак, функция предусматривает два аргумента:

  1. Число. Сюда указывается ссылка на ячейку. Или же можно ввести требуемое значение в этот аргумент вручную.
  2. Количество знаков, на какое собираетесь осуществить округление.

Чтобы округлить целое число (то есть, которое не имеет ни одного знака после запятой), просто напишите знак минуса перед числом во втором параметре. Для округления до десятков, необходимо написать -1, до сотен – -2, и по такой логике далее. Чем больше модуль этого числа, тем на большее количество цифр будет осуществляться округление. 

Основы использования функции ОКРУГЛ

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

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

4

Возможно округление не только числа, но и любого значения. На примере это выглядит так. Представим, что у нас есть три столбца. В первом записывается цена товара, во втором – сколько его было куплено. Но и в третьем, соответственно, указывается итоговая стоимость. 

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

5

По кратности

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

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

По количеству знаков

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

Примечания

  1. Кнут Д. Э. Искусство программирования. Том 1. Основные алгоритмы = The Art of Computer Programming. Volume 1. Fundamental Algorithms / под ред. С. Г. Тригуб (гл. 1), Ю. Г. Гордиенко (гл. 2) и И. В. Красикова (разд. 2.5 и 2.6). — 3. — Москва: Вильямс, 2002. — Т. 1. — 720 с. — ISBN 5-8459-0080-8.
  2. A’HEARN, B., J. BATEN AND D. CRAYEN (2009). “Quantifying Quantitative Literacy: Age Heaping and the History of Human Capital”, Journal of Economic History 69,783-808.
  3. В. М. Заварыкин, В. Г. Житомирский, М. П. Лапчик. Техника вычислений и алгоритмизация: Вводный курс: Учебное пособие для студентов педагогических институтов по физико-математическим специальностям. — М: Просвещение, 1987. 160 с.: ил.
  4. цит. по В. Гильде, З. Альтрихтер. «С микрокалькулятором в руках». Издание второе. Перевод с немецкого Ю. А. Данилова. М:Мир, 1987, стр. 64.

Эмпирические правила арифметики с округлениями

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

Все исходные значения округляются до реальной точности измерений и записываются с соответствующим числом значащих цифр, так, чтобы в десятичной записи все цифры были надёжными (допускается, чтобы последняя цифра была сомнительной). При необходимости значения записываются со значащими правыми нулями, чтобы в записи указывалось реальное число надёжных знаков (например, если длина в 1 м реально измерена с точностью до сантиметров, записывается «1,00 м», чтобы было видно, что в записи надёжны два знака после запятой), или точность явно указывается (например, 2500±5 м — здесь надёжными являются только десятки, до них и следует округлять).
Промежуточные значения округляются с одной «запасной» цифрой.
При сложении и вычитании результат округляется до последнего десятичного знака наименее точного из параметров (например, при вычислении значения 1,00 м + 1,5 м + 0,075 м результат округляется до десятых метра, то есть до 2,6 м). При этом рекомендуется выполнять вычисления в таком порядке, чтобы избегать вычитания близких по величине чисел и производить действия над числами по возможности в порядке возрастания их модулей.
При умножении и делении результат округляется до наименьшего числа значащих цифр, которое имеют множители или делимое и делитель

Например, если тело при равномерном движении прошло дистанцию 2,5 × 103 метров за 635 секунд, то при вычислении скорости результат должен быть округлён до 3,9 м/с, поскольку одно из чисел (расстояние) известно лишь с точностью до двух значащих цифр.

Важное замечание: если один операндов при умножении или делитель при делении является по смыслу целым числом (то есть не результатом измерений непрерывной физической величины с точностью до целых единиц, а, например, количеством или просто целой константой), то количество значащих цифр в нём на точность результата операции не влияет, и оставляемое число цифр определяется только вторым операндом. Например, кинетическая энергия тела массой 0,325 кг, движущегося со скоростью 5,2 м/с, равна Ek=mv22=0.325⋅5.222=4.394≈4.4{\displaystyle E_{k}={\tfrac {mv^{2}}{2}}={\tfrac {0.325\cdot 5.2^{2}}{2}}=4.394\approx 4.4} Дж — округляется до двух знаков (по количеству значащих цифр в значении скорости), а не до одного (делитель 2 в формуле), так как значение 2 по смыслу — целая константа формулы, она является абсолютно точной и не влияет на точность вычислений (формально такой операнд можно считать «измеренным с бесконечным числом значащих цифр»).

При вычислении значения функции f(x){\displaystyle f\left(x\right)} требуется оценить значение модуля производной этой функции в окрестности точки вычисления

Если |f′(x)|⩽1{\displaystyle \left|f’\left(x\right)\right|\leqslant 1}, то результат функции точен до того же десятичного разряда, что и аргумент. В противном случае результат содержит меньше точных десятичных разрядов на величину log10⁡(|f′(x)|){\displaystyle \log _{10}\left(\left|f’\left(x\right)\right|\right)}, округлённую до целого в большую сторону.

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

Интересный факт о strictfp

В Java есть специальное ключевое слово (strict floating point), которого нет в других языках программирования. И знаете, зачем оно нужно? Оно ухудшает точность работы с вещественными числами. История его появления примерно такова:

Создатели Java:

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

Создатели процессора Intel:

Ребята, мы улучшили наши процессоры, и теперь все вещественные числа внутри процессора будет представлены не 8-ю, а 10-ю байтами. Больше байт — больше знаковых цифр. А это значит что? Правильно: теперь ваши научные вычисления будут еще более точными!

Ученые и все, кто занимается сверхточными расчетами:

Круто! Молодцы. Отличная новость.

Создатели Java:

Не-не-не, ребята. Мы же сказали: все Java-программы должны выполняться одинаково на всех устройствах. Принудительно выключаем возможность использования 10 байтовых вещественных чисел внутри процессоров Intel.

Вот теперь все опять отлично! Не благодарите.

Ученые и все, кто занимается сверхточными расчетами:

Да вы там совсем охренели? Ану быстро вернули все как было!

Создатели Java:

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

Ученые и все, кто занимается сверхточными расчетами:

Нет. Совсем не круто. Быстро вернули все обратно! Или мы вашу Java вам знаете куда засунем?

Создатели Java:

Гм. Что же вы сразу не сказали. Конечно, вернем.

Вернули возможность пользоваться всеми фичами крутых процессоров.

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

Округление десятичных чисел

Чтобы округлить десятичные числа в JavaScript воспользуйтесь методами toPrecision и toFixed(). Оба метода принимают только один аргумент, который задает кол-во знаков после запятой или кол-во «значащих цифр» (то есть общее количество цифр в числе).

Если аргумент не будет задан в toFixed(), то по умолчанию будет выставлено значение 0. То есть максимальное значение 20 после без знаков после запятой. Если аргумент не задан в toPrecision, то число не меняется.

Важно! Оба метода toPrecision() и toFixed() возвращают не число, а округленное представление строки результата. То есть при «сложении» переменных randNum и rounded будет произведено не сложение, а конкатенация:. Если необходимо привести результат к числу, воспользуйтесь parseFloat:

Если необходимо привести результат к числу, воспользуйтесь parseFloat:

Важно! Чтобы число 5 округлилось в большую сторону, за исключением редких случаев; более детально чуть ниже.)

Также методы toPrecision() и toFixed() бывают полезны, когда целому числу нужно прописать десятичную часть. Это удобно при работе с валютами:

Внимание! Если в числе будет больше цифр, чем в toPrecision, то оно будет записано с мантиссой и порядком (в научном виде):

Комментарии

Поведение этого метода соответствует стандарту IEEE 754, разделу 4.The behavior of this method follows IEEE Standard 754, section 4. Этот тип округления иногда называют округлением в сторону отрицательной бесконечности.This kind of rounding is sometimes called rounding toward negative infinity.

Floor(Double)

Возвращает наибольшее целое число, которое меньше или равно заданному числу с плавающей запятой двойной точности.Returns the largest integral value less than or equal to the specified double-precision floating-point number.

d

Double

Число двойной точности с плавающей запятой.A double-precision floating-point number.

Возвращаемое значение

Double

Наибольшее целое число, которое меньше или равно .The largest integral value less than or equal to . Если значение параметра равно NaN, NegativeInfinity или PositiveInfinity, возвращается это значение.If is equal to NaN, NegativeInfinity, or PositiveInfinity, that value is returned.

Примеры

В следующем примере показан метод и его отличие от метода.The following example illustrates the method and contrasts it with the method.

Комментарии

Поведение этого метода соответствует стандарту IEEE 754, разделу 4.The behavior of this method follows IEEE Standard 754, section 4. Этот тип округления иногда называют округлением в сторону отрицательной бесконечности.This kind of rounding is sometimes called rounding toward negative infinity. Иными словами, если является положительным, любой дробный компонент усекается.In other words, if is positive, any fractional component is truncated. Если имеет отрицательное значение, присутствие любого компонента дробной части приводит к округлению его до меньшего целого числа.If is negative, the presence of any fractional component causes it to be rounded to the smaller integer. Операция этого метода отличается от Ceiling метода, который поддерживает округление в сторону положительной бесконечности.The operation of this method differs from the Ceiling method, which supports rounding toward positive infinity.

Начиная с Visual Basic 15,8, производительность преобразования типа «двойное в целое число» оптимизирована, если передать значение, возвращаемое методом, в любую функцию целочисленного преобразованияили если значение Double, возвращаемое, автоматически преобразуется в целое число с параметром Option-on , равным OFF.Starting with Visual Basic 15.8, the performance of Double-to-integer conversion is optimized if you pass the value returned by the method to the any of the integral conversion functions, or if the Double value returned by is automatically converted to an integer with Option Strict set to Off. Эта оптимизация позволяет коду выполняться быстрее — до двух раз быстрее для кода, который выполняет большое количество преобразований в целочисленные типы.This optimization allows code to run faster — up to twice as fast for code that does a large number of conversions to integer types. В следующем примере показаны оптимизированные преобразования:The following example illustrates such optimized conversions:

Заключение

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

Думаю, команда Go приняла правильное решение, добавив функцию Round() в стандартную библиотеку. Без этого мы бы продолжали пользоваться различными некорректными реализациями.

Надеюсь, теперь вам стало ясно, что при работе с float есть много подводных камней, про которые порой забывают даже эксперты. Легко придумать или скопировать откуда-то однострочную реализацию, но сложно написать действительно корректную. Неудивительно, что корректно работающее округление появилось лишь в шестой мажорной версии Java (через 15 лет, прошедших с релиза Java 1.0 до выхода Java 7), и я рад, что Go прошёл этот путь быстрее.

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

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

Adblock
detector