Закръгляване на реални числа
Реалните числа, за разлика от целите, съхраняват само приблизителна стойност и се използват в чужбина главно за съхранение на научни данни. Интегралните типове данни обикновено се използват за съхраняване на парични стойности. Въпреки това, цяло число обикновено не е достатъчно, за да съхраняваме парите си (този проблем е особено остър в Турция, където заплатата се получава в милиони турски лири). Следователно трябва да се използват реални числа за пари (започвайки с InterBase 6.0 и последващите версии на InterBase/Firebird/Yaffil има поддръжка за int64 или bigint в третия диалект).
InterBase има 2 типа данни за съхраняване на реални числа: float и двойна точност. Тези типове са еквивалентни съответно на делфийския единичен и двоен. Единичният има много ниска точност (само 4 байта дължина), докато двойната точност е напълно достатъчна (8 байта).
Като цяло правилото е просто: ако трябва да съхраните реално число, тогава го декларирайте като NUMERIC(15, 2) или като DECIMAL(15, 2) (в диалект 3 точността може да бъде до 18 знака вместо 15). В първия диалект определено ще има грешка при извършване на изчисления (поради факта, че числото се съхранява в реален тип), а в третия диалект няма да има грешки (числото се съхранява като цяло число), но може да има проблеми с препълването (вижте подробности за изпълнението на int64).
За да проверите точността на реалните числа в IB, не е необходимо да създавате таблици и да изпълнявате SQL оператори. Можете да експериментирате с двойници в Delphi или C++Builder. В същото време можете да използвате всеки от следните кодове като UDF за закръгляване на реални числа, както банкови, така и обикновени. Едно от най-популярните решения днес е UDF FormatFloat.
Следват примери за загуба на точност с различнивидове реални числа и начини за работа с тях. Информация, събрана от конференции fido7.ru.delphi.db, fido7.su.dbms, fido7.su.dbms.interbase, [email protected]. Авторството на някои писма, за съжаление, е загубено.
KDV ([email protected])
Резултатът е -43.9400000000001. Ако използвате единично вместо двойно (еквивалентно на FLOAT), тогава резултатът ще бъде още по-лош: -43.9400634765625.
Предмет: Кръг(2,5) = 2 .
понеделник, 14 септември 1998 г., Евгений Иванов == Глеб В. Уфимцев: =============================
Ще цитирам кореспонденцията от счетоводството, извинете ме.
===== начало ========= Ако купих 100 тетрадки за 12.10 и продадох 5 броя за месец, тогава отзад се появява допълнително пени
===== 1. Водете записи в десети от пенито. 2. Разделете закупената партида на 2 комплекта: 10 броя - по 13 копейки всеки, 90 броя - по 12 копейки всеки. Тогава 10 x 0,13 + 90 x 0,12 = 12,10. ===== AB> 1. Водете записи с десети от стотинката.
При тези обеми счетоводството се води с 6 цифри от гривната, в противен случай данъкът няма да е правилен (12 200 единици по 0,083333 UAH без ДДС). не записва - крайната цифра в реда трябва да е в копейки
AB> 2. Разделете закупената партида на 2 комплекта: 10 броя - по 13 копейки всеки, 90 броя - по 12 копейки всеки. Тогава 10 x 0,13 + 90 x 0,12 = 12,10.
Обяснете това на фирмата, от която донесохме данъчни фактури ====== SV>> Съхранявайте записи на тетрадки в хиляди бройки. Ако не стигат - по десет хиляди бройки. Проблемът със стотинките ще отшуми - проверено.
VK> Вирно. Ако направих външния вид на тъкането Shvatsky, се опитах да наложа външния вид на нишките на метрите.;-) VK> От този час - тилки в умни "намотки" от 200 м всяка (искате да извървите километрични бобини.
Особено приятно е да връчите фактура или чек за 0,006хиляди парчета Хората купуват партиди до 1 000 000 броя и продават на парче! ==== Момчета, извинявам се за намесата, но вече писах на Игор със сапун, но не е ли по-лесно да се използва (между другото, използвам от дълго време) някаква функция за грешка (това, според мен, от буржоазната банкова система) система за закръгляване до _най-близкото_ _четно_ - например (от примера на Игор):
И няма проблем със стотинките.
IC> Това означава складово счетоводство и оборотна ведомост и така да се счита за автоматична машина.
Всичко се счита за автоматично. Единственото нещо - но. Трябва да имате прави ръце, за да напишете някаква функция - осигурявайки това закръгляване :))) ============= Край ========
>>>> Това е правилото за счетоводно закръгляване. >>>> Половини до най-близкото четно число. >>>> Тъй като тази функция беше обявена дълго време в Delphi, мисля, че ще бъде намерена във всяка версия.
EI> хора, да кажем, че това е грешка, аз не съм функция, или американците имат напълно неруско счетоводство, заобиколих този рейк, използвайки променливата EI> varx: истински; i: цяло число; EI> х:=2,5; i:=round(x); EI> в резултат i = 3, мисля, че това можеше да бъде поставено отдавна и всеки месец някой ги настъпва :)
Павел Зотов
Андрей Багиров ([email protected])
Благодаря ти, Юджийн. Без теб нямаше да преброя и стотинка. :)
С уважение, Сергей Белов.
Документ от www.borland.com/devsupport/
Тъй като функцията Round() на Delphi използва "банкерско закръгляване", където стойността се закръгля до най-близкото четно число, как мога да закръгля число с плаваща запетая, използвайки по-традиционните средства, където дробните стойности по-малки от .5 закръглят надолу, а дробните стойности от .5 и по-големи закръглят нагоре?
Отговор: Следната функция демонстриразакръгляване надолу на числа с дробни стойности по-малки от .5 и закръгляване нагоре на числа с дробни стойности на .5 и по-големи.
Пример:
Пол Бонет
Използвал съм x = CAST (((x+0.00001)*100) AS INTEGER) /100; за борба с грешката при закръгляване в десетичните знаци с двойна точност.
Той принуждава число в цяло число, представляващо стотинки, след което се дели обратно до десетична форма, премахвайки пълзящите милипенси. 10 000-ната част от пенито (или каквото искате да използвате) се добавя, така че ако десетичното представяне се закръгля нагоре, да не се съкращава надолу.
Тази техника не е щателно тествана, но досега работи без проблем. Кажете ми, ако някой намери по-добра техника или я тества щателно.