
Két rendszer ugyanazt a pénzösszeget küldi egymásnak, mégis néhány cent eltérés jelenik meg az összesítésben. A hiba forrása lehet a számábrázolás, a kerekítés helye vagy az eltérő pénzegység. A JSON formailag hibátlan lehet akkor is, amikor a fogadó program más szabállyal értelmezi az összeget.
A következő példák technikai számítások, feltételezett, két tizedesjeggyel kezelt pénzösszegekkel. Számlázási vagy adózási szabályt nem állapítanak meg.
A tizedespont után is kell megállapodás
A JSON számjelölése tizedespontot használ. A magyarul leírt 12,34 érték számalakja ezért 12.34. A formátum nem írja elő, hogy a fogadó program ezt milyen belső számtípussal tárolja. Ezt a programnyelv, a feldolgozó és az alkalmazás adatmodellje határozza meg.
Az RFC 8259 JSON-szabvány a számok szöveges alakját és az együttműködési korlátokat rögzíti. Egy sikeres szintaktikai ellenőrzés a pénznem, a mértékegység és a kerekítési szabály helyességét önmagában nem igazolja.
Az adatkapcsolat leírásában ezért szerepeljen:
- milyen pénznemről van szó;
- főegységben vagy kisebb egységben érkezik az összeg;
- hány tizedesjegy megengedett;
- mikor és milyen irányban történik kerekítés;
- mekkora lehet a legnagyobb kezelt összeg.
Miért adhat furcsa eredményt az összeadás?
Sok rendszer bináris lebegőpontos számokat használ. Ebben a 0,1 és a 0,2 értéke általában közelítéssel tárolódik. Python szokásos lebegőpontos típusa mellett a 0.1 + 0.2 megjelenített eredménye 0.30000000000000004 lehet. Ez kisméretű ábrázolási eltérés, amely összehasonlításnál és kerekítésnél is számíthat.
A Python tizedes aritmetikai dokumentációja olyan típust mutat be, amely tizedes értékekkel dolgozik és szabályozható kerekítést biztosít. Pontos tizedes bemenethez a számot az eredeti tizedes szövegből célszerű felépíteni. Egy már közelített bináris érték tizedessé alakítása a korábbi eltérést is átviheti.
Saját példánkban 2,675 két tizedesre kerekítve, pozitív félértéknél felfelé választott szabállyal 2,68. A Python bináris lebegőpontos 2.675 értékének szokásos kétjegyű kerekítése 2.67 eredményt adhat. Ezért a pénzügyi adatkapcsolatban a bemeneti típust és a kerekítési módot együtt kell rögzíteni.
Számolás egész kisebb egységekkel
Ha egy adott pénzegység száz kisebb egységből áll, 12,34 tárolható 1234 kisebb egységként. Három ilyen tétel: 1234 × 3 = 3702, tehát 37,02 főegység. Egész számokkal az összeadás és a szorzás ezen a tartományon pontosan végezhető, feltéve hogy a típus kapacitását nem lépjük túl.
A százszoros váltószámot nem lehet minden pénznemre automatikusan alkalmazni. Az egységet a kapcsolódó rendszer szerződése adja meg. Árfolyam, darabonként tört egységár vagy kedvezmény alkalmazásakor köztes tizedes eredmény is keletkezhet; az egész egységes tárolás sem helyettesíti a kerekítési szabályt.
Soronként vagy összesítés után?
Vegyünk három darab, egyenként 0,335 főegységnyi számított értéket. Pozitív félértéknél felfelé kerekítve soronként 0,34-et kapunk, a három sor összege 1,02. Előbb összeadva 1,005 adódik, ezt két tizedesre kerekítve 1,01.
A különbség 0,01. Mindkét műveletsor következetesen végrehajtható, de azonos eredményt nem biztosítanak. A fogadó és küldő rendszernek ugyanazt a sorrendet kell követnie. A maradék elosztásának módját is dokumentáld, ha egy összeg több sorra történő felosztása után az összesennek pontosan egyeznie kell.
A JSON-formázó a dokumentum áttekintéséhez, a JSON-összehasonlító két adatváltozat összevetéséhez adhat általános segítséget. A pénzkezelés helyességét külön, ismert bemenetekből és várt összegekből álló próbákkal ellenőrizd.
Ellenőrzés éles adat nélkül
Egy kis próbakészlet tartalmazzon nullát, negatív korrekciót, félértékhez közeli összeget, több azonos sort és a megengedett legnagyobb összeget. Minden sorhoz írd fel az elvárt egységet és eredményt. A szövegként küldött tizedes összeg megőrizheti az eredeti alakot, de a fogadónak ettől még ellenőriznie kell a formátumot és a tartományt.
A megjelenítés külön réteg: a képernyőn két tizedesjegy látszata nem bizonyítja, hogy a háttérben is kétjegyű, pontos érték szerepel. A számítási és megjelenítési szabályokat külön vizsgáld.
Tudáspróba
1. Háromszor 1234 kisebb egység mennyi főegység százszoros váltásnál?
- A: 37,02.
- B: 370,2.
- C: 3,702.
2. Mennyi három 0,335 érték soronkénti összege, ha mindet 0,34-re kerekítjük?
- A: 1,005.
- B: 1,01.
- C: 1,02.
3. Mit igazol a JSON szintaktikai helyessége?
- A: A pénzügyi kerekítés szabályosságát.
- B: A dokumentum formátumának megfelelőségét.
- C: A helyes pénznem automatikus felismerését.
Megoldások és következő lépés
1. A. 1234 × 3 / 100 = 37,02.
2. C. Háromszor 0,34 = 1,02; az összesítés utáni kerekítés más eredményt adhat.
3. B. Az adat jelentését, egységét és üzleti szabályait a szintaktikai ellenőrzésen túl kell vizsgálni.
0–1 pont: írd fel egy példaösszeg fő- és kisebb egységét. 2 pont: ismételd meg a soronkénti és összesítés utáni kerekítést. 3 pont: készíts adatkapcsolati szabálylapot a pénznemről, típusról, váltószámról és kerekítésről, majd futtasd le a próbakészletet.

