Автор | Сообщение |
|
| |
Пост N: 166
Зарегистрирован: 12.11.06
|
|
Отправлено: 07.11.10 10:24. Заголовок: Волшебные числа и операции
Доброе утро! Вот наткнулся на очередную ошибку xHarbour и Clipper. Думал, что глюк ОС или ПК, но нет. Пример ошибки - оператор "остаток от деления": 8.8 * 3 = 26.4 или 3.3 * 3 = 9.9, но операции (%) дают 26.4%8.8 = 8.8 или (НО правильно) 9.9%3.3 = 0 Вопрос - как Вы обходите данные глюки? Или где в "арифметике" ожидать очередных "засад"? До кучи напомню об ошибочной работе функции Int в Clipper (в xHarbour кажется работает правильно)
|
|
|
Ответов - 150
, стр:
1
2
3
4
5
6
7
8
All
[только новые]
|
|
|
| |
Пост N: 7396
Зарегистрирован: 17.05.05
|
|
Отправлено: 15.06.21 13:49. Заголовок: Pasha пишет: Достат..
Pasha пишет: цитата: | Достаточно конечную цифру, я так и делаю |
| А если складывать вот так ? X+= Base->KLV * Base->CENA , где KLV , "N" ,10,3 а CENA , "N" ,10,2
|
|
|
|
| Администратор
|
Пост N: 4028
Зарегистрирован: 23.05.05
|
|
Отправлено: 15.06.21 14:13. Заголовок: здесь конечно требуе..
здесь конечно требуется промежуточное округление, иначе погрешность в случае дробного количества будет достигать до полкопейки
|
|
|
|
| |
Пост N: 330
Зарегистрирован: 05.11.05
|
|
Отправлено: 15.06.21 19:13. Заголовок: Я сейчас уже не помн..
Я сейчас уже не помню, что у меня было, но были примеры где промежуточное округление и итоговое разные значения давали. Очевидно, что ошибка была не в 0,00....001, а большая и они накапливались.
|
|
|
|
| Администратор
|
Пост N: 4029
Зарегистрирован: 23.05.05
|
|
Отправлено: 15.06.21 20:20. Заголовок: round(1/3+1/3+1/3, 2..
round(1/3+1/3+1/3, 2) --> 1.00 round(1/3, 2)+round(1/3, 2)+round(1/3, 2) --> 0.99
|
|
|
|
| |
Пост N: 331
Зарегистрирован: 05.11.05
|
|
Отправлено: 16.06.21 07:24. Заголовок: Все округления могут..
Все округления могут быть полезны, лучше все и делать.
|
|
|
|
| Администратор
|
Пост N: 4030
Зарегистрирован: 23.05.05
|
|
Отправлено: 16.06.21 09:15. Заголовок: Я обычно обхожусь бе..
Я обычно обхожусь без округления Сделал такую функцию, для сравнения чисел с точностью до двух десятичных знаков: #include "hbapi.h" #include "math.h" HB_FUNC( EQU ) { double d1 = hb_parnd( 1 ); if( HB_ISNUM( 2 ) ) { double d2 = hb_parnd( 2 ); hb_retl( fabs( d1 - d2 ) < 0.005 ); } else hb_retl( fabs( d1 ) < 0.005 ); } вместо nSum1 == nSum2 или подобное использую Equ(nSum1, nSum2)
|
|
|
|
| Администратор
|
Пост N: 4031
Зарегистрирован: 23.05.05
|
|
Отправлено: 16.06.21 11:13. Заголовок: Если скинуть в Excel..
Если скинуть в Excel достаточно большой заполненный dbf-файл, порядка 10 тыс.записей, с числовым полем размерностью N,12, 2 и затем с произвольной строки помечать числовую колонку, то начиная примерно с пометки 1500-2000 строк обязательно возникает погрешность суммы (которую видно внизу Excel) в 8-м знаке в ту или другую сторону, та же микрокопейка Если продолжать помечать колонку дальше, то при пометке 3-4 тыс строк погрешность может аннигилироваться. Забавно Эффект лучше наблюдать в LibreOffice. Погрешность суммирования то появляется, то исчезает
|
|
|
|
| |
Пост N: 332
Зарегистрирован: 05.11.05
|
|
Отправлено: 16.06.21 12:20. Заголовок: Pasha пишет: исполь..
Pasha пишет: цитата: | использую Equ(nSum1, nSum2) |
| А я вставил округление до копейки в функцию и где считал нужным писал valround(значение).
|
|
|
|
| постоянный участник
|
Пост N: 3765
Зарегистрирован: 17.02.12
|
|
Отправлено: 16.06.21 12:44. Заголовок: rvu пишет где считал..
rvu пишет цитата: | где считал нужным писал valround(значение) |
| Помогает исп. рабочих полей в dbf "N", 19, <все нужные варианты>, т.е через них расчеты. Т.к. клиент сам ставит варианты nDec для разных групп номенклатуры (2, 3, 4, 5, 7), то привязывал имя раб. поля к номенклатуре (picture тоже если надо), работает вариант со времен S87
|
|
|
|
| Администратор
|
Пост N: 4134
Зарегистрирован: 23.05.05
|
|
Отправлено: 23.10.23 13:20. Заголовок: Просто крик души Сда..
Просто крик души Сдаем отчет РСВ-1 в ФНС Получаем протокол: 0400400013-СНИЛС XXX-XXX-XXX XX ст.170 (2 м.) = 8873.77 Расчетная сумма = (ст.150 поп + ст.150 (1 мес. + 2 мес.)) * тариф - ст.170 поп - ст.170 (1 мес.) = 150678.66 * 30/100 - 36329.82=8873.79 разница = -.02 V не принимается. II. По основаниям, предусмотренным пунктом 7 статьи 431 Налогового кодекса Российской Федерации: 0400400011-Нарушено условие равенства значения суммы страховых взносов по плательщику страховых взносов совокупной сумме страховых взносов по застрахованным лицам конец протокола проверяю на калькуляторе: 150678.66 * 30/100 - 36329.82 = 8873.78 и там дальше 4 такие же ошибки ФНС, если кто не знает, это Федеральная Налоговая Служба Российской Федерации Риторический вопрос: как научить ФНС арифметике ?
|
|
|
Ответов - 150
, стр:
1
2
3
4
5
6
7
8
All
[только новые]
|
|