округлення чисел

Округлення чисел. Невже ТАК правильно.

Вчора почув від викладача курсів Бух. обліку наступне правило округлення:
1. 15.746 -> 17.7
2. 15.764 -> 17.8
3. 17.752 -> 17.8
4. 17.252 -> 17.2
5. 17.052 -> 17.0

Було видано твердження - Якщо за останній значущою цифрою стоїть 5, то останню цифру збільшують, якщо вона непарна і уменьшют, якщо парна.

Перший раз чую про таке? Парна цифра, непарна. Невже я колись прогуляв якусь лекцію з обчислювальної математики? Ми там багато різних заокруглень вивчали, але щоб такого.
Та й у школі не було такого!

Невже таке пріавло дійсно існує.

ти остаточно впав у моїх очах
;))))))

Це так зване "бухгалтерське" округлення. Має місце бути.

4. 17.252 -> 17.2
Це не вірно, але завжди можна ввести в рамки закону
Ці правило діють коли лежить рівно посередині, наприме
3. 17.750 -> 17.8
4. 17.250 -> 17.2


> Ці правило діють коли лежить рівно посередині, наприме
>

Але в курсі вишки, вич. мату і близько математичних науках такого твердження я не зустрічав. Я закінчив спец. програмне забезпечення вич. техніки і на малу кількість годин математики ми поскаржитися не могли. Я твердо був упевнений, що якщо за останньою значущою цифрою стоїть 5. то округляється в більшу сторону. Навіть якщо рівно посередині (17,250000).
Я не правий?


> Це так зване "бухгалтерське" округлення. Має місце
> Бути.

Це жарт, чи серйозно? Якщо серйозно, то це повинно бути прописано в якомусь нормативному документі. В якому?

>> Це жарт, чи серйозно?
Цілком серйозно. Те, до чого ми з тобою звикли - звичайне математичне округлення. А в бухгалтерських розрахунках застосовується те, про що ти пишеш. І в програмах відповідних. А щодо нормативних документів не знаю, я ж не "букгактер".

> Невже таке пріавло дійсно існує.
а ти спробуй в Дельфах округлити там таке і получіш

RoundTo uses "Banker's Rounding" to determine how to round values.

The following examples illustrate the use of RoundTo:
Expression Value
RoundTo (1234567, 3) 1234000
RoundTo (1.234, -2) 1.23
RoundTo (1.235, -2) 1.24
RoundTo (1.245, -2) 1.24


> Це так зване "бухгалтерське" округлення.

Є, стопудово.
Не знаю точної підоснови, але, можливо, при частій роботі такого округлення при великих за рахунками округлення вгору-вниз компенсують один одного (їх буде приблизно порівну) і виходить золота середина :)


> Це внутрішня справа

Внутрішнє справу кого? Організації або галузі?

Якщо я в своїй організації буду застосовувати одне округлення, а податкова інше, то на масиві чисел буде розбіжність. Невелике розбіжність, але формально з точки зору податкової я опинюся не правий? Штрафи, пеня.

Подібне округлення прийнято в бухобліку. Соотв. податкова теж застосовує це округлення, так що все має зійтися, принаймні на папері :))

Ох-хо-хо. Ще раз.
Припустимо, що розподіл чисел у нас близький до рівномірного випадкового. Тоді при "арифметичному" округленні маємо:

Як легко помітити, якщо є великий масив чисел, які потім знадобиться підсумовувати (разом для позицій документа, сальдо за рахунком і т.п.), то при "арифметичному" округленні буде накопичуватися систематична похибка з матожиданием
0.5 * 10 ^ n * 0.1 * N
де:
n - десятковий вага розряду, до якого проводиться округлення (до двох знаків n = -2, до цілих n = 0 і т.д.)
0.1 - ймовірність кожної цифри
N - число сумміруемих чисел в масиві

Для того, щоб вирівняти ймовірності похибок треба компенсувати єдину нескомпенсованого (див. Таблицю вище) похибка +5. Для цього вона штучно розбивається на дві рівноімовірні +5 -5 залежно від парності попередньої цифри.

До речі, в слові стану FPU є прапорець, який контролює режим округлення (арифметичний / бухгалтерський).

При арифметичних обчисленнях справа не закінчується тим розрядом, який ми округляємо. При рівномірному випадковому розподілі за цифрою 0 йде в середньому 0.5. Тому:

Якщо ми це все підсумуємо, то отримаємо якраз 0.

Насправді таке окгугленіе правильніше, якщо потім доведеться підсумувати резльтати окргуленія, якщо діяти загальноприйнятим способом (округляти в більшу сторону якщо остання цифра 5) дасть велику похибку в сумі чисел. Для мінімізації похибки суми і застосовується таке ось округлення. Воно використовується не тільки в бухгалтерських розрахунках, а й напрмер в геодезичних при обробці результатів інструментальної зйомки.

Як це може бути? Відрізок від 0 до 5-d в точності дорівнює відрізку від 5 до 10-d, де d визначається розрядністю машини. Здається мені, що розглянутий хитрий алгоритм - забобон бухгалтерів-трієчників.

> uw
Імовірність того, що перед п'ятіркою виявиться парне або непарне число приблизно однакова. Якщо ж весь час округляти в більшу сторону, що набігає похибка буде тільки збільшуватися, а при такому підході, погешность буде то складатися, то відніматися, що в підсумку повинно її мінімізувати. А якщо це не робити, то це Череван або фінансовими втратами, або неможливістю нормальної експлуатації або взагалі обваленням споруджуваного споруди. А розглянуті хитрий аглорітм це не забобон бухгалтерів трієчників, а методика, запропонована для статистичних Розрахунок самим Гауссом (якщо тобі це ім'я про щось говорить)

> uw
ти міркуєш як математик. а у бухгалтерів все числа мають кінцеве число знаків. якщо відкидається 1 цифра, то DS дав тобі табличку. якщо відкидається 2 цифри, то похибка виходить ближче до твоєї, але все-таки не 0.5, а 0.45 = (сума від 0 до 9) / 10. тому при підсумовуванні буде середня похибка буде ненульовий. чим більше знаків було у вихідних числах, тим менше ця похибка, але ніколи не нуль. бухгалтерське правило робить її нулем при будь-якій кількості відкидаються цифр.

Я не розумію, від чого відкидається. Припустимо, ми зважили ковбасу, порахували, отримали 32.1234567. руб. Округляем. Замість справжнього значення з періодом отримуємо 32.12 руб. І що?

- не виходить ніяк.
ціна ковбаси - 2 знака після коми.
ваги - 4 знака після коми.
разом - 6, округляємо до 2-х.
зроби оцінку погрешнсті в такій ситуації.

сорри, ваги - 3 знаки. разом - 5.

Шкільний алгоритм округлення не весь час округлює в більшу сторону. Цифри 0,1,2,3,4 він округлює в меншу сторону, а цифри 5,6,7,8,9 - в більшу. І тих, і інших рівно по п'ять. Якщо у Гаусса інші міркування, покажи мені їх, я не знайшов в Інтернеті.

> uw
приклад:
1.245 + 1.115 = 2.36

Округляем до двох знаків в більшу сторону, оскільки остання цифра 5 отримуємо:
1.25 + 1.12 = 2.3 7 (маємо похибка при підсумовуванні)

А тепер округляем по Гауса:
1.24 + 1.12 = 2.36 (похибки немає)

1.244 + 1.245 = 2.489 = 2.49

По-шкільному:
1.24 + 1.25 = 2.49


Цифри 0,1,2,3,4 він округлює в меншу сторону, а цифри 5,6,7,8,9 - в більшу

Цифра 0 взагалі нікуди не округляється.

Вирішіть прімерчік
1.25 + 1.35 + 1.45 + 1.55 =.

а точно
б) округляючи кожний доданок до #. # арифметично
б) округляючи кожний доданок до #. # по-бухгалтерски

Порівняйте відповіді і зробіть висновок.

Але я ще й помоделіровал і побачив, що по-шкільному нітрохи не гірше:

procedure Test;
var
a, b: Double;
s1, s2: Double;
i: Integer;
begin
s1: = 0; s2: = 0;
Randomize;
a: = RoundTo (1.235, -2);
a: = RoundTo (1.245, -2);
a: = RoundTo (1.255, -2);
a: = RoundTo (1.265, -2);
for i: = 1 to 1000 do begin
a: = Random (10000) / 1000;
b: = Random (10000) / 1000;
s1: = s1 + Round ((a + b) * 1000) / 1000 -
(Round (a * 100) / 100 + Round (b * 100) / 100);
s2: = s2 + Round ((a + b) * 1000) / 1000 - (RoundTo (a, -2) + RoundTo (b, -2));
end;
end;

> uw
схоже ще один літак;) але з математикою я думаю простіше буде розібратися.

давай для простоти розглянемо арифметичне округлення десяткового числа з n знаками після коми до цілого. беремо ну дуже рівномірний розподіл розподіл, всі числа від 0 до 0,99..99:
0,00. 00
0,00. 01
0,00. 02
0,00. 03
.
0,49. 99 - округлюються до 0
0,50. 00
0,50. 01
.
0,99. 99 - округлюються до 1

легко бачити, що середня помилка округлення 5 * 10 ^ (- n)


> Але я ще й помоделіровал і побачив, що по-шкільному нітрохи
> Не гірше:

Нісенітницю ви намоделіровалі.

var
Table: array [word] of double;
i: integer;
S, S1, S2: extended;
begin
randomize;
S: = 0;
for i: = low (Table) to high (Table) do
begin
Table [i]: = Random * 10;
S: = S + Table [i]; // це буде точна сума
end;

Set8087CW ($ 1372); // включаємо "бухгалтерське" округлення
S1: = 0;
for i: = low (Table) to high (Table) do
S1: = S1 + Round (Table [i]);

Set8087CW ($ 1B72); // включаємо "шкільне" округлення
S2: = 0;
for i: = low (Table) to high (Table) do
S2: = S2 + Round (Table [i]);

writeln (S: 20: 0, S1: 20: 0, S2: 20: 0);
if S2 <= S1 then writeln("DS должен мне $1000. ");

Запускаємо, насолоджуємося набігла похибкою.
Можете тіло програми укласти в нескінченний цикл, відповідь сюди пишіть не раніше, ніж заробите $ 1000..

> uw
> Насправді, я твою думку зрозумів вже після розмови про ковбасу.
дик, якщо б ти про це сказав, я б і не встрявав. ;)

Уявімо число X у вигляді
X = A + a * 10 ^ (n + 1) + b * 10 ^ n + R, де:
A> = 10 ^ (n + 1)
a, b in
R <10^n
n =. -2, -1, 0, 1, 2. вага відкидається розряду

Тоді округлене число X "буде отримано у вигляді
X "= A + a" * 10 ^ (n + 1),
а правила округлення описують отримання a ".
Для "шкільного" округлення
a "= a при b <5
a "= a + 1 при b> = 5

похибка
d = X - X "= (A + a * 10 ^ (n + 1) + b * 10 ^ n + R) - (A + a" * 10 ^ (n + 1)) = (aa ") * 10 ^ (n + 1) + b * 10 ^ n + R
d = b * 10 ^ n + R при b <5
d = -1 * 10 ^ (n + 1) + b * 10 ^ n + R = -1 * (10-b) * 10 ^ n + R при b> = 5

У кого-то ще залишилися якісь питання?

Спеціально для uw
Питання з округленням нуля, вважаю, вирішене? Діапазон похибки округлення дев'ятки, як легко бачити, перекравает діапазон округлення нуля і одиниці. А діапазон п'ятірки залишається єдиним не мають симетричного діапазону іншого знака.
Зі мною важко розмовляти з позицій "я був глибоко переконаний", але надзвичайно легко, як ви правильно зауважили, говорити доказово.

ЗИ
Номер повідомлення, де употредляется слово "осів", сподіваюся, не важко вказати?

вилучено модератором
Примітка: Особисте листування

Поясни мені тільки одне: чому

якщо d = b * 10 ^ n + R при b <5, а R <10^n?

> Поясни мені тільки одне: чому
а це щоб відповідь який треба отримати :)
якщо робити по правді, то вийде
b діапазон
-----------------------------
0 [0; 10 ^ n)
1 [10 ^ n; 2 * 10 ^ n)
2 [2 * 10 ^ n; 3 * 10 ^ n)
3 [3 * 10 ^ n; 4 * 10 ^ n)
4 [4 * 10 ^ n; 5 * 10 ^ n)
5 [5 * 10 ^ n; 4 * 10 ^ n)
6 [4 * 10 ^ n; -3 * 10 ^ n)
7 [3 * 10 ^ n; -2 * 10 ^ n)
8 [-2 ^ 10 ^ n; -10 ^ n)
9 [-10 ^ n; 0)
в середньому 0. і залишаться ще питання. ))

Я побоявся так конкретно (:

Хуманум Ерар ест. Але це вже не важливо.
Йолки-палки. Ви мені зовсім мізки запудрили.

round (2.5) = 2
round (2.500000000000000001) = 3

"Бухгалтерський" правило застосовується не просто якщо b = 5 (в раніше введених позначеннях), а ще якщо R = 0. А для випадку R = 0 діапазони похибок вироджуються в числа, я вже цю табличку приводив:
b d
---------------------
0 +0
1 + 1 * 10 ^ n
2 + 2 * 10 ^ n
3 + 3 * 10 ^ n
4 + 4 * 10 ^ n
5 -5 * 10 ^ n
6 -4 * 10 ^ n
7 -3 * 10 ^ n
8 -2 * 10 ^ n
9 -1 * 10 ^ n

Все ОК. Тепер мені можна йти в булгахтери. але в маленькі :)

Схожі статті