Finans uygulamalarında para yuvarlama: parayı güvenle saklayın
Finans uygulamalarında para yuvarlaması bir kuruş hatalarına yol açabilir. Kuruş olarak tamsayı saklama, vergi yuvarlama kuralları ve web ile mobilde tutarlı gösterim öğrenin.

Neden bir kuruş hataları olur
Bir kuruş hatası, kullanıcıların hemen fark ettiği türden bir hatadır. Ürün listesinde sepet toplamı $19.99 gözükür, ama ödeme sırasında $20.00 olur. $14.38 iade $14.37 olarak düşer. Bir fatura satırı “Vergi: $1.45” derken, genel toplam farklı bir vergi hesaplamasıyla eklenmiş gibi görünür.
Bu sorunlar genellikle üst üste binen küçük yuvarlama farklılıklarından kaynaklanır. Para sadece “bir sayı” değildir. Kuralları vardır: hangi ondalık basamaklar kullanılır, ne zaman yuvarlanır ve yuvarlama satır bazında mı yoksa nihai toplamda mı yapılır. Uygulamanız bir yerde farklı bir tercih yaparsa tek bir kuruş eklenebilir veya eksilebilir.
Ayrıca bunlar bazen sadece ara sıra ortaya çıkar, bu yüzden hata ayıklaması zordur. Aynı girdiler, cihaz veya yerel ayarlar, işlem sırası veya değerlerin tipler arasında dönüştürülme şekline bağlı olarak farklı kuruşlar üretebilir.
Yaygın tetikleyiciler arasında float veya double ile hesaplama yapmak ve “sonunda” yuvarlamak (ama “son” her yerde aynı değildir), bir ekranda satır başına vergi uygulayıp başka bir yerde ara toplam üzerinden vergi uygulamak, para birimlerini veya döviz kurlarını karıştırıp farklı adımlarda yuvarlamak ya da gösterim için değerleri formatlayıp istemeden tekrar sayı olarak parse etmek bulunur.
Zarar en çok güvenin kırılgan olduğu ve tutarların denetlendiği yerlerde hissedilir: ödeme toplamları, iadeler, faturalar, abonelikler, bahşişler, ödemeler ve gider raporları. Bir kuruş uyumsuzluğu ödeme hatalarına, uzlaştırma güçlüklerine ve “uygulamanız benden çalıyor” gibi destek taleplerine yol açabilir.
Amaç basittir: aynı girdiler her yerde aynı kuruşu üretmelidir. Aynı ürünler, aynı vergi, aynı indirim, aynı yuvarlama kuralı — ekran, cihaz, dil veya rapor ne olursa olsun.
Örnek: iki adet $9.99 ürün %7.25 vergiye sahipse, verginin satır başına mı yoksa ara toplam üzerine mi yuvarlanacağına karar verin ve bunu backend, web UI ve mobil uygulamada aynı şekilde uygulayın. Tutarlılık, “neden burada farklı?” anını engeller.
Neden floatlar para için risklidir
Çoğu programlama dili float ve double değerlerini ikili olarak saklar. Birçok ondalık fiyat ikiliye tam olarak dönüşemez, bu yüzden kaydettiğinizi zannettiğiniz sayı genellikle çok küçük bir miktar daha yüksek veya daha düşük olur.
Klasik örnek 0.1 + 0.2'dir. Birçok sistemde bu 0.30000000000000004 olur. Bu zararsız görünür, ama para mantığı genellikle bir zincirdir: ürün fiyatları, indirimler, vergi, ücretler ve sonra nihai yuvarlama. Küçük hatalar bir yuvarlama kararını tersine çevirebilir ve bir kuruş fark yaratabilir.
Yuvarlama hatası belirtileri:
- Günlüklerde veya API cevaplarında 9.989999 veya 19.9000001 gibi değerler görünmesi.
- Birçok ürün eklendikten sonra toplamların sürüklenmesi, her bir ürün görünürde düzgün olsa bile.
- Bir iade toplamının orijinal tahsilattan $0.01 fark etmesi.
- Aynı sepet toplamının web, mobil ve backend arasında farklı olması.
Formatlama genellikle problemi gizler. Eğer 9.989999'u iki ondalıkla yazdırırsanız 9.99 görünür, dolayısıyla her şey doğruymuş gibi görünür. Hata, birçok değeri topladığınızda, toplamları karşılaştırdığınızda veya vergiden sonra yuvarlama yaptığınızda ortaya çıkar. Bu yüzden ekipler bazen bunu yayına alır ve ödeme sağlayıcılar veya muhasebe dışa aktarımları ile uzlaşma sırasında keşfeder.
Basit bir kural: parayı kayan nokta olarak saklamayın veya toplamayın. Parayı para biriminin küçük biriminin tamsayı sayısı (örn. kuruş) olarak düşünün veya kesin ondalık matematik garantileyen bir decimal türü kullanın.
Backend, web veya mobil uygulama (AppMaster gibi no-code platformları dahil) geliştiriyorsanız, aynı prensibi her yerde uygulayın: hassas değerleri saklayın, hassas değerlerde hesaplayın ve son adımda sadece gösterim için formatlayın.
Gerçek para birimlerine uyan bir para modeli seçin
Çoğu para hatası matematik başlamadan önce olur: veri modeli gerçekten para biriminin nasıl çalıştığıyla eşleşmez. Modeli baştan doğru almak yuvarlamayı bir kural problemi haline getirir, tahmin işi olmaktan çıkarır.
En güvenli varsayılan, parayı para biriminin küçük biriminde bir tamsayı olarak saklamaktır. USD için bu kuruş; EUR için euro cent. Veritabanınız ve kodunuz tam tamsayılarla çalışır, insanlar için formatlarken yalnızca ondalık eklenir.
Her para birimi 2 ondalık kullanmaz, bu yüzden modeliniz para birimine duyarlı olmalıdır. JPY 0 küçük ondalığa sahiptir (1 yen en küçük birimdir). BHD genelde 3 ondalık kullanır (1 dinar = 1000 fils). Eğer her yerde “iki ondalık” sabitlerseniz, sessizce fazla veya eksik tahsilat yaparsınız.
Pratik bir para kaydı genellikle şunları gerektirir:
amount_minor(tamsayı, örn. $19.99 için 1999)currency_code(USD, EUR, JPY gibi string)- sisteminiz güvenilir şekilde bakamıyorsa opsiyonel
minor_unitveyascale(0, 2, 3)
Her miktarla birlikte para birimi kodunu saklayın, hatta aynı tabloda dahi. Bu, daha sonra çoklu para birimi fiyatlandırması, iadeler veya raporlar eklerken hataları önler.
Ayrıca yuvarlamaya nerede izin verildiğine ve nerede yasaklandığına karar verin. İyi işleyen bir politika: dahili toplamlar, tahsislarda, muhasebe defterlerinde veya devam eden dönüşümlerde yuvarlama yapmayın; yalnızca tanımlı sınır noktalarda yuvarlayın (ör. vergi adımı, indirim adımı veya nihai fatura satırı); ve kullanılan yuvarlama modunu (half up, half even, round down) kaydedin ki sonuçlar yeniden üretilebilir olsun.
Adım adım: küçük birim-tamsayı para uygulayın
Daha az sürpriz isterseniz, para için tek bir dahili şekil seçin ve bozmayın: tutarları para biriminin küçük biriminde (çoğunlukla kuruş) tamsayı olarak saklayın.
Bu, $10.99'un 1099 ve para birimi USD olması demektir. Kuruşu olmayan para birimleri için (ör. JPY) 1.500 yen 1500 olarak kalır.
Büyüdükçe ölçeklenebilen basit uygulama yolu:
- Veritabanı:
amount_minorsütununu 64-bit tamsayı ve para birimi kodu ile saklayın. Kolon adını açık koyun ki kimse ondan bir decimal sandamasın. - API sözleşmesi:
{ amount_minor: 1099, currency: "USD" }gibi gönderip alın. "$10.99" gibi formatlanmış dizelerden veya JSON float'lardan kaçının. - UI girişi: Kullanıcının yazdığını sayı değil metin olarak ele alın. Normalleştirin (boşlukları kırpın, tek ondalık ayırıcı kabul edin) ve sonra para biriminin küçük birim basamaklarına göre dönüştürün.
- Tüm matematik tamsayılarda: toplamlar, satır toplamları, indirimler, ücretler ve vergiler yalnızca tamsayılar üzerinde çalışmalıdır. Örneğin “yüzde indirim önce hesaplanır sonra küçük birime yuvarlanır” gibi kuralları tanımlayın ve her yerde aynı şekilde uygulayın.
- Sadece sonunda formatlayın: para gösterirken
amount_minor'ı locale ve para birimi kurallarına göre gösterim dizesine çevirin. Kendi formatladığınız çıktıyı tekrar matematiğe sokmayın.
Pratik bir parsing örneği: USD için "12.3"'ü "12.30" olarak kabul edip 1230 olarak dönüştürün. JPY için ondalık girişleri baştan reddedin.
Vergi, indirim ve ücret yuvarlama kuralları
Çoğu bir kuruş anlaşmazlığı matematik hatası değildir. Politika hatasıdır. İki sistem her ikisi de “doğru” olabilir ve yine de farklı sonuç verebilirlerse sorun olur; çünkü farklı zamanlarda yuvarlama yapmış olabilirler.
Yuvarlama politikanızı yazın ve her yerde kullanın: hesaplamalar, makbuzlar, dışa aktarımlar ve iadeler. Yaygın seçimler arasında half-up (0.5 yukarı), half-even (0.5 en yakın çift sayıya) ve her zaman yukarı (ceiling) gibi modlar vardır. Bazı ücretler asla eksik tahsil edilmemesi gerektiği için hep yukarı yuvarlama gerektirebilir.
Toplamlar genellikle şu kararlara göre değişir: satır başına mı yoksa fatura bazında mı yuvarladığınız, kuralları karıştırıp karıştırmadığınız (ör. satır başına vergi ama faturada ücretler) ve fiyatların vergi dahil mi yoksa hariç mi olduğu (vergi dahilse net ve vergiyi tersine hesaplama, hariçse vergi netten hesaplanır).
İndirimler başka bir çatallanma getirir. %10 indirim vergiden önce uygulanırsa vergilendirilebilir tabanı azaltır; indirim vergiden sonra uygulanırsa müşterinin ödediği miktarı azaltır ama raporlanan vergiyi etkilemeyebilir (yargı ve sözleşmeye bağlı olarak).
Küçük bir örnek, katı kuralların neden önemli olduğunu gösterir. İki adet $9.99, %7.5 vergi. Eğer vergi satır başına yuvarlanırsa, her satır için vergi $0.75 olur (9.99 x 0.075 = 0.74925). Toplam vergi $1.50 olur. Eğer fatura toplamı üzerinden vergi uygulanırsa burada de $1.50 olur, ama fiyatları biraz değiştirin bir kuruş fark göreceksiniz.
Kuralı düz bir dille yazın ki destek ve finans bunu açıklayabilsin. Sonra aynı yardımcı fonksiyonu vergi, ücret, indirim ve iadeler için yeniden kullanın.
Döviz dönüşümü ve toplam kaymasını önleme
Çoklu para birimi matematiği, küçük yuvarlama seçimlerinin toplamları yavaşça değiştirebildiği yerdir. Amaç basittir: bir kere dönüştürün, niyetli olarak yuvarlayın ve orijinal verileri saklayın.
Döviz kurlarını açık bir kesinlikle saklayın. Yaygın bir desen ölçeklenmiş tamsayıdır; örn. “rate_micro” gibi, 1.234567 değeri 1234567 olarak ve 1.000.000 ölçeğiyle saklanır. Diğer bir seçenek sabit ondalık türüdür, ama yine de alanlarda ölçeği yazın ki tahmin edilemesin.
Raporlama ve muhasebe için bir temel para birimi seçin (genelde şirket para birimi). Gelen tutarları muhasebe ve analitik için temel para birimine çevirin, ama orijinal para birimi ve tutarı da yanında saklayın. Böylece her sayıyı sonra açıklayabilirsiniz.
Kaymayı önleyen kurallar:
- Muhasebe için dönüşümler tek yönde yapın (yabancıdan temele) ve geri dönüşümlere kaçının.
- Yuvarlama zamanını karar verin: satır gösterimi gerekiyorsa satır başına yuvarlayın, sadece genel toplam gösteriliyorsa sonunda yuvarlayın.
- Tek bir yuvarlama modunu tutarlı kullanın ve belgeleyin.
- Orijinal tutarı, para birimini ve işlemde kullanılan kesin oranı saklayın.
Örnek: müşteri 19.99 EUR öder, bunu 1999 minor unit ve currency=EUR olarak saklarsınız. Ayrıca checkout'ta kullanılan oranı saklarsınız (örn. EUR -> USD micro birimlerde). Defteriniz seçilen kurala göre dönüştürülmüş USD tutarını saklar (seçilen kurala göre yuvarlanmış), ama iadeler saklanan orijinal EUR tutarı ve para birimini kullanır, USD'den yeniden dönüştürme yapmaz. Bu, “neden bana 19.98 EUR iade edildi?” destek biletlerini engeller.
Cihazlar arası formatlama ve gösterim
Son adım ekrandır. Bir değer depoda doğru olabilir ama formatlama değişirse web ve mobil arasında yanlış görünebilir.
Farklı lokaller farklı noktalama ve sembol yerleşimi bekler. Örneğin ABD'de kullanıcılar $1,234.50 okurken birçok Avrupa ülkesinde 1.234,50 € beklenir (aynı değer, farklı ayırıcılar ve sembol pozisyonu). Eğer formatlamayı sert kodlarsanız insanları şaşırtırsınız ve destek işi çıkarırsınız.
Her yerde bir kural: kenarda formatlayın, çekirdekte değil. Gerçek kaynak (currency code, minor units integer) olmalıdır. Yalnızca gösterim için dizeye dönüştürün. Formatlanmış dizgeleri tekrar paraya çevirmekten kaçının; yuvarlama, kesme ve locale sürprizleri oradan sızar.
İadeler gibi negatif miktarlar için tutarlı bir stil seçin ve her yerde kullanın. Bazı sistemler -$12.34 gösterirken bazıları ($12.34) gösterir. Her ikisi de kabul edilebilir; ama ekranlar arasında geçiş yapmak hata gibi görünür.
Cihazlar arası çalışan basit bir sözleşme:
- Para birimini ISO kodu olarak taşıyın (USD, EUR), sadece sembol değil.
- Gösterim için varsayılan olarak cihazın lokalesini kullanın, ama uygulama içi bir geçersiz kılma seçeneği sunun.
- Çoklu para ekranlarında miktarın yanında para birimi kodunu gösterin (örn. 12.34 USD).
- Girdi formatlamasını gösterim formatlamasından ayrı ele alın.
- Yuvarlamayı para kurallarınıza göre bir kez yapın, sonra formatlayın.
Örnek: müşteri mobilde 10,00 EUR iadesi görür, aynı siparişi masaüstünde açtığında -€10 görür. Kodu de gösterirseniz (10,00 EUR) ve negatif stili tutarlı tutarsanız, değişip değişmediğini merak etmezler.
Örnek: sürpriz olmadan ödeme, vergi ve iade
Basit bir sepet:
- Ürün A: $4.99 (499 kuruş)
- Ürün B: $2.50 (250 kuruş)
- Ürün C: $1.20 (120 kuruş)
Ara toplam = 869 kuruş ($8.69). Önce %10 indirim uygulayın: 869 x %10 = 86.9 kuruş, 87 kuruşa yuvarlanır. İndirimli ara toplam = 782 kuruş ($7.82). Şimdi %8.875 vergi uygulayın.
İşte yuvarlama kuralları final kuruşu değiştirebilir.
Eğer vergiyi fatura toplamı üzerinden hesaplarsanız: 782 x %8.875 = 69.4025 kuruş, 69 kuruşa yuvarlanır.
Eğer vergiyi satır bazında (indirim sonrası) hesaplayıp her satırı yuvarlarsanız:
- Ürün A: $4.49 vergi = 39.84875 kuruş, 40'a yuvarlanır
- Ürün B: $2.25 vergi = 19.96875 kuruş, 20'ye yuvarlanır
- Ürün C: $1.08 vergi = 9.585 kuruş, 10'a yuvarlanır
Satır vergi toplamı = 70 kuruş. Aynı sepet, aynı oran, farklı geçerli kural; 1 kuruş fark.
Vergiden sonra bir kargo ücreti ekleyin, örn. 399 kuruş ($3.99). Toplam fatura-seviyesi vergide $12.50 veya satır-seviyesi vergide $12.51 olur. Bir kural seçin, belgeleyin ve tutarlı olun.
Şimdi sadece Ürün B'yi iade edin. İndirimli fiyatını iade edin (225 kuruş) ve ona ait vergiyi. Satır-seviyesi vergi varsa bu 225 + 20 = 245 kuruş ($2.45) olur. Kalan toplamlar hala tam olarak uzlaşır.
Her tahsilat ve iade için açıklama yapmak üzere bu değerleri kaydedin:
- satır başına net kuruş, satır başına vergi kuruşu ve kullanılan yuvarlama modu
- fatura indirim kuruşu ve nasıl tahsis edildiği
- kullanılan vergi oranı ve hesaplanan vergiye esas alınan kuruş
- kargo/ücret kuruşu ve bunların vergilendirilebilir olup olmadığı
- nihai toplam kuruş ve iade kuruşu
Para hesaplamalarını nasıl test edersiniz
Çoğu para hatası “matematik hatası” değildir. Yuvarlama, sıra ve formatlama hatalarıdır ve belirli sepetlerde veya tarihlerde ortaya çıkar. İyi testler bu vakaları sıkıcı hale getirir.
Sabit golden testlerle başlayın: sabit girdilerle tam beklenen çıktılar (kuruş cinsinden) ile. Doğrulamalar sıkı olsun. Bir öğe 199 kuruş ise ve vergi 15 kuruş ise test tamsayı değerleri kontrol etsin, formatlanmış dizeleri değil.
Küçük bir golden seti çok şeyi kapsayabilir:
- Vergili tek satır, sonra indirim, sonra ücret (ara yuvarlamaları kontrol edin)
- Birçok satırda verginin satır bazında mı yoksa ara toplamda mı yuvarlandığı (seçtiğiniz kuralı doğrulayın)
- İadeler ve kısmi iadeler (işaret ve yuvarlama yönünü doğrulayın)
- Dönüşüm round-trip (A -> B -> A) ve yuvarlamanın nerede yapıldığını tanımlayan politika
- Kenar değerler (1 kuruşluk ürünler, büyük miktarlar, çok büyük toplamlar)
Sonra property-based testler (veya basit rastgele testler) ekleyin. Tek bir beklenen sayı yerine invariant'ları doğrulayın: toplamlar satır toplamlarına eşit olmalı, hiçbir zaman kesirli minor birim olmamalı ve “total = subtotal + tax + fees - discounts” her zaman sağlanmalı.
Platformlar arası test önemli çünkü backend ve istemciler arasında sonuçlar kayabilir. Go backend ile Vue web app ve Kotlin/SwiftUI mobiliniz varsa, aynı test vektörlerini her katmanda çalıştırın ve UI dizeleri değil tamsayı çıktılarını karşılaştırın.
Son olarak, zaman bazlı vakaları test edin. Bir faturada kullanılan vergi oranını saklayın ve oranlar değiştikten sonra bile eski faturaların aynı sonucu verdiğini doğrulayın. İşte “eski hesap tutmuyor” hatalarının kaynağı budur.
Kaçınılması gereken yaygın tuzaklar
Çoğu bir kuruş hatası bir “politik hata”dır: kod tam olarak söylediğinizi yapar, fakat finansın beklediği şeyi yapmaz.
Dikkat edilmesi gereken tuzaklar:
- Çok erken yuvarlama: Eğer her satırı yuvarluyorsanız, sonra ara toplamı yuvarlayıp sonra vergiyi yuvarlarsanız toplamlar sürüklenir. Bir kural belirleyin (ör. satır başına vergi mi yoksa fatura toplamında mı) ve sadece politika izin verdiği yerlerde yuvarlayın.
- Farklı para birimlerini aynı toplamda karıştırmak: USD ve EUR'yu aynı “total” alanında toplamak masum görünür ama iadeler, raporlama veya uzlaştırma sırasında sorun çıkarır. Tutarları para birimi ile etiketleyin ve herhangi bir çapraz para toplamından önce kabul edilmiş bir oranla dönüştürün.
- Kullanıcı girdisini yanlış parse etmek: Kullanıcılar “1,000.50”, “1 000,50” veya “10.0” yazabilir. Parserınız tek bir format varsayıyorsa sessizce 100050 yerine 1000.50 tahsil edebilir veya son sıfırları düşürebilir. Girişi normalleştirin, doğrulayın ve minor birim olarak saklayın.
- Formatlanmış dizeleri API veya veritabanında kullanmak: "$1,234.56" sadece gösterim içindir. API bunu kabul ederse başka bir sistem farklı parse edebilir. Tamsayıları (minor birimler) ve para birimi kodunu gönderin; her istemci kendi yerel formatlamasını yapsın.
- Vergi kurallarını veya oran tablolarını versiyonlamamak: Vergi oranları değişir, muafiyetler değişir ve yuvarlama kuralları değişir. Eski oranı üzerine yazarsanız geçmiş faturaları yeniden üretmek imkansızlaşır. Her hesaplama ile versiyon veya yürürlük tarihini saklayın.
Kısa bir gerçeklik kontrolü: Pazartesi oluşturulan bir ödeme geçen ayın vergi oranını kullanır; Cuma iade edildiğinde oran değiştiyse ve siz vergi sürümünü saklamadıysanız iade orijinal makbuzla eşleşmez.
Hızlı kontrol listesi ve sonraki adımlar
Daha az sürpriz istiyorsanız parayı net girdiler, kurallar ve çıktılar olan küçük bir sistem gibi ele alın. Çoğu bir kuruş hatası, yuvarlamanın nerede yapılacağının yazılmamasından doğar.
Yayınlamadan önce kontrol listesi:
- Tutarları her yerde küçük birimlerde (tamsayı kuruş) saklayın: veritabanı, iş mantığı ve API'ler.
- Tüm matematiği tamsayılarla yapın ve sadece gösterimde ondalık formata çevirin.
- Her hesaplama için bir yuvarlama noktası seçin (vergi, indirim, ücret, FX) ve bunu tek bir yerde zorunlu kılın.
- Web ve mobilde para birimi kurallarına göre (ondalıklar, ayırıcılar, negatif değerler) tutarlı formatlama yapın.
- Kenar durumlar için testler ekleyin: 0.01, dönüşümlerde tekrarlayan ondalıklar, iadeler, kısmi tahsilatlar ve büyük sepetler.
Her hesaplama türü için bir yuvarlama politikası yazın. Örneğin: “İndirim satır başına en yakın kuruşa yuvarlanır; vergi fatura toplamı üzerinden yuvarlanır; iadeler orijinal yuvarlama yolunu tekrarlar.” Bu politikaları koda ve ekip dokümantasyonuna ekleyin ki zaman içinde kaymasınlar.
Her önemli para adımı için hafif günlükler (log) ekleyin. Girdi değerlerini, seçilen politika adını ve minor unit çıktısını yakalayın. Müşteri “benden bir kuruş fazla çekildi” dediğinde nedenini açıklayan tek bir satırınız olsun.
Üretimde mantığı değiştirmeden önce küçük bir denetim planlayın. Gerçek tarihli siparişlerden bir örnek alıp eski ve yeni sonuçları yeniden hesaplayın, sonra uyuşmazlıkları sayın. Birkaç uyuşmazlığı manuel gözden geçirip yeni politikanın doğruluğunu onaylayın.
Bu tür uçtan uca akışı üç kez aynı kuralları tekrar yazmadan kurmak isterseniz, AppMaster (appmaster.io) tam uygulamalar için tasarlanmıştır. Data Designer ile PostgreSQL'de minor-unit tamsayıları modelleyebilir, Yuvarlama ve vergi adımlarını bir Business Process içinde bir kez uygulayıp web ve native mobil UI'lerde aynı mantığı yeniden kullanabilirsiniz.
SSS
Genellikle uygulamanın farklı bölümlerinin farklı zamanlarda veya farklı şekillerde yuvarlamasından kaynaklanır. Ürün listesi bir adımda yuvarlarken ödeme ekranı başka bir adımda yuvarlıyorsa aynı sepet farklı kuruşlara ulaşabilir.
Çünkü çoğu float sayısı yaygın ondalık fiyatları ikili gösterimde tam olarak temsil edemez; gizli küçük hatalar birikir. Bu küçük farklar daha sonra bir yuvarlama kararını tersine çevirerek bir kuruş uyumsuzluğu yaratabilir.
Para birimini veritabanında ve API'de para biriminin küçük birimi olarak bir tamsayı şeklinde saklayın; örneğin USD için 1999 = $19.99. Ayrıca bir para birimi kodu tutun. Hesaplamaları tamsayılarla yapın ve kullanıcıya gösterirken ondalık dizeye çevirin.
İki ondalık sabitlemek JPY (0 ondalık) veya BHD (3 ondalık) gibi para birimleri için hataya yol açar. Her zaman miktarla birlikte para birimi kodunu saklayın ve giriş/parsing ile çıktı/formatlama sırasında doğru küçük birim ölçeğini uygulayın.
Açık ve tek bir kural seçin ve her yerde uygulayın: örn. vergi satır başına yuvarlanır veya fatura toplamında yuvarlanır gibi. Anahtar, backend, web, mobil, dışa aktarımlar ve iadelerde aynı yuvarlama modunun kullanılmasıdır.
Sırayı baştan belirleyin ve bunu politika olarak ele alın. Yaygın bir varsayılan, önce indirimi uygulayıp sonra vergiyi hesaplamaktır (vergilendirilebilir bazı azaltmak için), ancak işletmeniz ve yargı alanınızın gerektirdiği kurala uymalısınız ve tüm ekranlar ile servislerde aynı kuralı korumalısınız.
Bir kez dönüştürün, dönüşüm için kullanılan oranı saklayın ve niyetli olarak belirlenmiş bir adımda yuvarlayın. İade işlemlerinde orijinal para ve tutarı saklayın; tekrar tekrar dönüşüm yapmak tutarların kaymasına neden olur.
Formatlanmış dizgeleri tekrar sayıya çevirmeyin; yerel ayırıcılar ve yuvarlama değeri değiştirebilir. Yapılandırılmış değerler olarak (amount_minor, currency_code) taşıyın ve sadece UI kenarında locale kurallarına göre gösterim yapın.
Sabit "golden" testleri kullanın: her adım için beklenen tam minor-unit çıktıları (ör. kuruş) ile doğrulama yapın. Sonra invariants testleri ekleyin: toplamlar satırların toplamına eşit olmalı, hiçbir zaman kesirli minor birim görünmemeli ve total = subtotal + tax + fees - discounts gibi ifadeler her zaman sağlanmalı.
Parasal mantığı tek bir paylaşılan yerde merkezileştirin ve her yerde yeniden kullanın, böylece aynı girdiler her yerde aynı kuruşu üretir. AppMaster içinde pratik bir yaklaşım, amount_minor'ı PostgreSQL'de tamsayı olarak modelleyip yuvarlama ve vergi mantığını tek bir Business Process'e koymaktır; bu mantık web ve mobil akışlar tarafından tekrar kullanılabilir.


