Peněžní částky nezaokrouhlené na 2 desetinná místa
import { Aside } from ‘@astrojs/starlight/components’;
Symptom
Sekce “Symptom”Součty na dokladech se rozcházejí o haléře — kontrolní součet položek ≠ uvedený total, DPH na faktuře ≠ DPH v účetnictví, nabídka a z ní vystavená faktura se liší o pár haléřů.
Root cause
Sekce “Root cause”Částky se počítají ve float a zobrazují/ukládají bez zaokrouhlení na 2 desetinná místa. Akumulované chyby plovoucí čárky a různé pořadí zaokrouhlování (po položce vs. ze součtu, jiný základ pro DPH) způsobí rozdíly. Časté, když se DPH počítá jednou z nabídky a jindy z jiného základu.
Fix
Sekce “Fix”Centralizuj zaokrouhlení a počítej DPH konzistentně:
const round2 = (n) => Math.round((n + Number.EPSILON) * 100) / 100;
// každá uložená/zobrazená částka projde round2; DPH ze stejného základuconst base = round2(qty * unitPrice);const vat = round2(base * vatRate);const total = round2(base + vat);Pro kritické účetnictví zvaž celočíselné haléře (minor units) místo float.
Jak se tomu vyvarovat v jiných systémech
Sekce “Jak se tomu vyvarovat v jiných systémech”- Detection: grepni výpočty cen/total bez zaokrouhlení; porovnej součet položek s uvedeným totalem.
- Anti-pattern: float aritmetika peněz roztroušená po kódu, různé pořadí/základ zaokrouhlování.
- Lepší přístup: jeden
round2(nebo integer minor units) + jednotné pravidlo, odkud se počítá DPH (nabídka i doklad ze stejného základu).
Sister bugs / související
Sekce “Sister bugs / související”- Trial/0-částky generují doklady (viz platební kategorie).