[identity profile] stupid1amo.livejournal.com posting in [community profile] useful_faq
Привет!
Вопрос про округление
Есть число — 33,734912
Надо округлить до сотых.
Как правильно, и почему?
Я всегда округлял по очереди, так что получалось 33,74, да и учили меня так.
но тут мне сказали что это всё неправильно, и при округлении до сотых смотрят только на тысячные, так что получается как 33,73
Аргументы, пожалуйста.

Спасибо!

Date: 2011-02-15 03:54 pm (UTC)
From: [identity profile] lazyreader.livejournal.com
Сказали правильно. 33,734912 ближе к 33,73, чем к 33,74.

То, что вы делали, называется накопление ошибки.

Date: 2011-02-15 04:47 pm (UTC)
From: [identity profile] i-crust.livejournal.com
именно. классический пример - 0,44444 0,4445 0,445 0,45 0,5 1

Date: 2011-02-15 06:20 pm (UTC)
From: [identity profile] i-crust.livejournal.com
сорри, начнем с 0,444445

Date: 2011-02-15 03:58 pm (UTC)
From: [identity profile] roquefort-tln.livejournal.com
правила округления смотрим - если следующая 5 и больше, то +1, если 4 и меньше - оставляем как есть. Фсе.

Date: 2011-02-15 04:09 pm (UTC)
From: [identity profile] chva.livejournal.com
Такой способ округления приводит к накоплению статистической ошибки. Не лишу вас удовольствия выяснить самостоятельно почему это так и как с этим бороться, но если лень искать, то могу и написать.

Date: 2011-02-15 04:38 pm (UTC)
From: [identity profile] chva.livejournal.com
При таком способе округления возникает систематическая ошибка — допустим, у нас есть миллион чисел с тремя и более знаками после запятой, а надо округлить их до второго знака (вполне реальная необходимость, в бухгалерии на каждом шагу, округление до копеек, центов и т.п.) Разумеется, мы вправе ждать что сумма полученных цифр будет близка к сумме первоначальных, с минимальными отклонениями. А между тем, если исходные числа подчиняются обычному закону распределения, мы увидим, что сумма округлённых будет всегда больше чем исходных. Для бухгалтерии это недопустимо. Почему так происходит? При округлении мы либо незначительно уменьшаем число, либо незначительно увеличиваем (если 3-я цифра от 1 до 4 — уменьшаем, от 5 до 9 — увеличиваем). Но ведь цифры в числе должны быть распределены равномерно, а уменьшаем мы в 4 из 10 случаях, а увеличиваем — в пяти из десяти! Другими словами, если третья цифра 1, мы уменьшаем на 0,001, если третья цифра 9, то увеличиваем на 0,001 и в большой последовательности эти уменьшения/увеличения складываются и сумма будет около ноля. То же касается и пары 2 и 8, 3 и 7, 4 и 6. А вот для пятёрки пары нет. То есть в среднем одно число из десяти увеличивается на 0,005 или каждое в среднем примерно на 0,0005. Для 1 000 000 чисел увеличение составит 500 рублей. Не сходится бухгалтерия :) Тут используется т.н. бухгалтерское округление — если после пятёрки стоит чётная цифра, то округляем вниз, если нечётная, то вверх.

Почему в бухгалтерии возникают числа с более чем двумя знаками после запятой? Например, виноват НДС. Или стандартный коэффициент наценки. Допустим, себестоимость мы определили в 197 рублей 35 копеек. Накручиваем сверху наценку 1,3 и НДС 1,18 вот и выходит.

Или в счетах-фактурах есть графы Стоимость без НДС, НДС и стоимость с НДС. Если умножить общую стоимость без НДС на 1,18 то мы можем из-за ошибок такого обычного округления не получить сумму по графе Стоимость с НДС — я с таким сталкивался не раз :) Хотя уже давно не связан со счетами-фактурами и т.п., но вот вспомнилось.

Date: 2011-02-15 04:46 pm (UTC)
From: [identity profile] chva.livejournal.com
Вот нашёл статью, если интересно, то можете почитать: http://www.interface.ru/home.asp?artId=19535
(deleted comment)

Date: 2011-02-15 06:49 pm (UTC)
From: [identity profile] chva.livejournal.com
Может быть даже не бухгалтеры, а те кто пишет для них софт :)

Date: 2011-02-15 07:15 pm (UTC)
From: [identity profile] kranken.livejournal.com
Просто ужас :(

1) округление происходит не по цифрам, а по интервалам. Т.е. парой считается не 1 и 9, а (0,1] и [9,10).
2) из 1) следует что "непарной" остается не следующий разрядный знак 5, а следующие разрядные знаки 5(0).
3) соответственно, для "бухгалтерского округления" смотрится четность/нечетность не следующего после "5" разрядного знака (там всегда 0), а предыдущего.

Ко всему прочему есть ГОСТовские правила округления для измеряемых величин (видно, что оно "арифметическое" с дополнительными пунктами насчет округления округленного).

ПРИЛОЖЕНИЕ А
(справочное)
Правила округления

А.1. Округление представляет собой отбрасывание значащих цифр справа до определенного разряда с возможным изменением цифры этого разряда.
Пример: Округление числа 132,48 до четырех значащих цифр будет 132,5.

А.2. В случае, если первая из отбрасываемых цифр (считая слева направо) меньше 5, последняя сохраняемая цифра не меняется.
Пример: Округление числа 12,23 до трех значащих цифр дает 12,2.

А.3. В случае, если первая из отбрасываемых цифр (считая слева направо) равна 5, последняя сохраняемая цифра увеличивается на единицу.
Пример: Округление числа 0,145 до двух значащих цифр дает 0,15.

Примечание - В случаях, когда следует учитывать результаты предыдущих округлений, поступают следующим образом:
- если отбрасываемая цифра получилась в результате предыдущего округления в большую сторону, то последняя сохраняемая цифра сохраняется.
Пример: Округление до одной значащей цифры числа 0,15 (полученного после округления числа 0,149) дает 0,1;
- если отбрасываемая цифра получилась в результате предыдущего округления в меньшую сторону, то последняя оставшаяся цифра увеличивается на единицу (с переходом при необходимости в следующие разряды).
Пример: Округление числа 0,25 (полученного в результате предыдущего округления числа 0,25) дает 0,3.

А.4. В случае, если первая из отбрасываемых цифр (считая слева направо) больше 5, то последняя сохраняемая цифра увеличивается на единицу.
Пример: Округление числа 0,156 до двух значащих цифр дает 0,16.

А.5. Округление следует выполнять сразу до желаемого количества значащих цифр, а не по этапам.
Пример: Округление числа 565,46 до трех значащих цифр производится непосредственно на 565.

Округление по этапам привело бы:
на I этапе к 565, 5;
на II этапе к 566 (ошибочно).

А.6. Целые числа округляют по тем же правилам, как и дробные.
Пример: Округление числа 12456 до двух значащих цифр дает 12 × 10^3.

Date: 2011-02-15 07:43 pm (UTC)
From: [identity profile] chva.livejournal.com
Не совсем понимаю смысл Вашего комментария.

1) Например, «округление происходит не по цифрам, а по интервалам» противоречит приведённому Вами же правилу округления из ГОСТ «Округление представляет собой отбрасывание значащих цифр справа до определенного разряда с возможным изменением цифры этого разряда.»

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

2) не совсем понятно при чём здесь ГОСТ для измеряемых величин. Бухгалтерская отчётность к ним не относится.

3) По поводу следующей после пятёрки цифры — моя ошибка.

4) Если Вам интересно, кроме ГОСТ существуют и другие документы. IEEE 754 приводит семь типов округления:

round-down - усечение по направлению к нулю
round-half-up - арифметическое округление
round-half-even - банковское округление
round-ceiling - округление к плюс-бесконечности
round-floor - округление к минус-бесконечности
round-half-down (опционально) - подобно арифметическому, пятерка округляется вниз
round-up - (опционально) округление от нуля

Приведённое Вами ГОСТовское — это второй из типов.

Date: 2011-02-16 04:23 am (UTC)
From: [identity profile] kranken.livejournal.com
ГОСТ к бухгалтерским величинам, действительно, не относится. Но, если я не ошибаюсь, специальных правил округления для бухгалтерских нужд в РФ не принято. Согласно разным документам методы округления несколько отличаются, посему бухи часто перестраховываются округляя отчисления в бюджеты в большую сторону. А ГОСТ какой-никакой регламентирующий документ с указанием области применения.

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

Для "бухгалтерского" округления этого недостаточно. Требуется рассмотрение ВСЕХ отбрасываемых разрядов и правило вверх-вниз применяется только в случае 5(0). В остальных случаях 5-ки округление происходит вверх. Т.е. здесь мы явным образом сталкиваемся с интервалами.

С интервалами мы сталкиваемся и в приведенном ГОСТе при рассмотрении правил округления уже округленных величин.

P.S. Или вы на полном серьезе считаете, что по "бух" правилам 0.5999999 будет округляться до 0?

Date: 2011-02-15 09:14 pm (UTC)
From: [identity profile] shabalrusht.livejournal.com
Именно рассказанное вами Правило мы изучали в 7-ом, кажется, классе. Или в 6-ом. Но точно не в 5-ом и не в 8-ом.

Date: 2011-02-15 09:17 pm (UTC)
From: [identity profile] shabalrusht.livejournal.com
К тому, что матчасть следует учить и знать.

Date: 2011-02-15 09:26 pm (UTC)
From: [identity profile] lily-13.livejournal.com
Прикольное рассуждение.
А если 3-я цифра 0 - тоже ведь уменьшаем. :)) Почему про это забыли?

Date: 2011-02-15 04:16 pm (UTC)
From: [identity profile] roquefort-tln.livejournal.com
имеете в виду, что круглую пятерочку хорошо бы в обе стороны равномерно раскидывать?

но к данному случаю имхо неприменимо.

Date: 2011-02-15 04:26 pm (UTC)
From: [identity profile] chva.livejournal.com
Да, именно об этом и говорю. Гуглить надо ключевую фразу «бухгалтерское округление».

Date: 2011-02-15 04:00 pm (UTC)
From: [identity profile] line-in-out.livejournal.com
имхо если рассуждать логически -
ведь округляется в большую сторону, если доля больше 1/2
в меньшую - меньше 1/2
в нашем случае
0,004912 - меньше половины предыдущего разряда, значит округлять его надо в меньшую сторону.

Date: 2011-02-15 04:01 pm (UTC)
From: [identity profile] orang-m.livejournal.com
т.к. третья цифра меньше 5 то остается как есть.

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

Date: 2011-02-15 04:08 pm (UTC)
From: [identity profile] excubitus.livejournal.com
А вы таки покупаете или продаете?
По правилам 33.73

Date: 2011-02-15 04:14 pm (UTC)
From: [identity profile] apashenko.livejournal.com
Универсальное правило округления: к разряду, следующему за округляемым прибавляем пять и начиная с него всё отбрасываем.

Date: 2011-02-15 04:48 pm (UTC)
From: [identity profile] chva.livejournal.com
Ну это для программистов, наверное. Если есть функция типа floor(x), которая просто отбрасывает все цифры после десятичной точки, то чтобы из floor получить арифметическое округление, нужно использовать floor(x+0.5)

Date: 2011-02-15 05:42 pm (UTC)
From: [identity profile] apashenko.livejournal.com
Чтобы не было соблазна в следующие разряды заглядывать и забивать себе голову несущественными мелочами.

Date: 2011-02-15 05:53 pm (UTC)
From: [identity profile] apashenko.livejournal.com
Правильным. Читайте внимательно. Пятёрку прибавляем к следующему разряду.
Если округляем до единиц, прибавляем 0,5; до десятков - 5; до сотен - 50 и т.д. В вашем случае прибавляем 0,005.

Date: 2011-02-15 06:13 pm (UTC)
From: [identity profile] kranken.livejournal.com
если от 33,7399 отбросить тысячные и меньше, то останется 33,73.

Date: 2011-02-15 06:14 pm (UTC)
From: [identity profile] apashenko.livejournal.com
Ещё внимательнее читайте. "и начиная с него всё отбрасываем." 33,73 получится.

Date: 2011-02-15 04:30 pm (UTC)
From: [identity profile] grey-horse.livejournal.com
Если у вас было бы 337349 шт. чего-нибудь и число надо было бы округлить до сотен, то ответ очевиден? Вот и здесь так же.

Date: 2011-02-15 05:30 pm (UTC)
From: [identity profile] 5terkin.livejournal.com
Округляйте как вам выгодней.

Date: 2011-02-15 06:45 pm (UTC)
From: [identity profile] karpion.livejournal.com
33,74-33,734912=0,005088
33,734912-33,73=0,004912
Во втором случае ошибка меньше.