Digitális és informatikai

Pénzösszeg JSON-ban: tizedes kerekítés és egész váltópénzegység

A JSON számként és szövegként is szállíthat pénzösszeget, de a pontos jelentést az adatkapcsolat szabályai adják. Megnézzük a bináris lebegőpontos eltérést, a tizedes kerekítést és az egész váltópénzegységekkel való számolást.

Dajka Gábor4 perc olvasás
Dajka Gábor portréja sárga háttérrel
Dajka Gábor

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.

Színezett programkód számítógép képernyőjén
Illusztráció: Pixabay · Felhasználási feltételek

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.

További cikkek

Kapcsolódó olvasnivalók

Gyorskereső

Kalkulátorok és útmutatók keresése

↑↓ választásEnter megnyitásEsc bezárás