Закръгляване на реални числа

Реалните числа, за разлика от целите, съхраняват само приблизителна стойност и се използват в чужбина главно за съхранение на научни данни. Интегралните типове данни обикновено се използват за съхраняване на парични стойности. Въпреки това, цяло число обикновено не е достатъчно, за да съхраняваме парите си (този проблем е особено остър в Турция, където заплатата се получава в милиони турски лири). Следователно трябва да се използват реални числа за пари (започвайки с 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-ната част от пенито (или каквото искате да използвате) се добавя, така че ако десетичното представяне се закръгля нагоре, да не се съкращава надолу.

Тази техника не е щателно тествана, но досега работи без проблем. Кажете ми, ако някой намери по-добра техника или я тества щателно.