Re: Правила округлення. Яке округлення застосовувати до xml. Як округлює ГІС
Додано: 28 лютого 2012 12:03
Це була бета-версія, для xml дану помилку виправили, а для in4 ще не встигли. В офіційній версії виправимо.doslidnik писав:БАГ №1. Площу ділянки приведеної в першому пості зберігає для in4, як 5.9613 для кварталу та угіддя, але для ділянки 5.9612. Нагадаю в налаштуваннях округлення координат треба ставити 4.
По-різному, бо, як я вже й пояснював, числа з одним і тим самим закінченням, при двійковому вигляді, мали різну похибку:doslidnik писав: БАГ №2
Як буде округлювати ГІС6 числа XXX.7150 XXX.7250 XXX.7256 XXX.7156 до 2-х знаків?. Округлює по різному.
Число 4264962,7250 при зберіганні в числовому вигляді в пам'яті ПК зберігається як 4264962,724999999360000
Число 4188675.7250 при зберіганні в числовому вигляді в пам'яті ПК зберігається як 4188675,725000000000000
Можете це перевірити, наприклад в FastReport (це не наша розробка, це російський модуль для створення шаблонів документів, його використовує Digitals і ще де-які програми, якраз нехай хто в них працює, спробує і скаже результат). Для цього достатньо просто вивести число з великою точністю до 12-15 знака
Код: Виділити все
[FormatFloat('0.000000000000000', 4264962.7250)]
4264962.7250 - наше число.
Дана функція просто форматує число до заданої точності.
От якраз через це, стандартна функція заокруглення в Delphi працює не по-різному, як сказав doslidnik, а цілком логічно, округлюючи математичним способом:
4264962,724999999360 після заокруглення 4264962,72 (бо 4 попереду)
4188675,725000000000 після заокруглення 4264962,73 (бо 5 попереду)
Якщо працювати завжди з однією точністю, то така комп'ютерна похибка не помітна. А якщо стрибати від однієї точності до іншої, то да, похибка буде впливати на кінцевий результат. Зараз ми врахували її і зробили власну функцію заокруглення по типу бухгалтерського заокруглення (ще називається банківським, бо саме там воно вперше почало використовуватись, round-half-even), так як він максимально підходить для роботи з площами.
Для тих, хто погано вчився, поясню. :) Якщо цифра справа, перед якою потрібно заокруглити, менше 5, то ліва цифра не змінюється, якщо цифра справа більше 5, то ліва цифра збільшується на одиницю. Якщо цифра справа рівна 5, а ліва - парна - не змінюється, якщо ліва - не парна, то збільшується на одиницю. Також враховується друга права цифра, для компенсації.
Для кращого розуміння цього заокруглення, дивіться таблицю, де заокруглення йде до цілого числа:
Код: Виділити все
0.5 - 0
0.55 - 1
1.5 - 2
1.55 - 2
2.5 - 2
2.55 - 3
3.5 - 4
3.55 - 4
4.5 - 4
4.55 - 5
5.5 - 6
5.55 - 6
6.5 - 6
6.55 - 7
7.5 - 8
7.55 - 8
8.5 - 8
8.55 - 9
9.5 - 10
9.55 - 10