eMeL * BCB Emelő


Egy kis adatbázis kezelés: float vagy numeric(13,2) ?




Float vagy Numeric(13,2)

Hogyan jön egy adatbázis kezelési kérdés egy programozói lapra? Hát úgy, hogy adatbázist márpedig kell kezelni;)
Ettől függetlenül az alábbi példa az örök 'a lebegőpontos számok számábrázolási problémája' kérdéskörből ered, így más területeken is hasznosítható ez a tudás;)

Interbase illetve Firebird esetén használj mindenképpen TIBDatabase::SQLDialect = 3 -at, mert akkor a lemezen 32 vagy 64 bites integerben tárolja a numeric típusokat (a numeric(15,2)-at pl. 64 biten). Integerben tárolja és eltárolja hogy mennyi a tizedesjegy eltolás (mint a TCurrency;) Ez takarékos és a kerekítés kényszer szemlélete miatt praktikus választás.

Ez annyi többletet ad a float típusokkal szemben, hogy ha az adatbázisban (pl. tárolt eljárásban vagy lekérdezésben művelettel (pl. szorzás)) végzel, akkor automatikus kerekítések történnek, ami fontos lehet pl továbbhalmozásnál.


Égy magyarázó példa:

Kalkulált mező, készletérték kezelésére:


         Menny   * EgysegAr    = Ertek (Ft)

1. tétel 1.01 db * 1.49 Ft/db -> 1.5049, ha kiiratásban két tizedesre kényszeríted, akkor 1.50 Ft

2. tétel 1.01 db * 1.49 Ft/db -> 1.5049, ha kiiratásban két tizedesre kényszeríted, akkor 1.50 Ft

--------------------------------------------------------------------------------------------------------------------

Szumma: sum(Ertek)               3.0098, ha kiiratásban két tizedesre kényszeríted, akkor 3.01 Ft


Ha tehát a kalkulált meződ típusa numeric(15,2), akkor a kliensen összeadott tételes lista összege megegyezik a sum()-os lekérdezés összeggel.

Mindez lebegőpontos típus használata esetén a fenti, a lebegőpontos számoknál jólismert probléma lehetőségét veti előre.


XXX

XXX




© eMeL Bt. * Utolsó módosítás: 2003.03.28