BuradaMoney açıklandığı gibi tip önerilmiyor gibi görünüyor
Uygulamamın para birimini saklaması gerekiyor, hangi veri türünü kullanmalıyım? Sayısal, Para veya FLOAT?
BuradaMoney açıklandığı gibi tip önerilmiyor gibi görünüyor
Uygulamamın para birimini saklaması gerekiyor, hangi veri türünü kullanmalıyım? Sayısal, Para veya FLOAT?
Yanıtlar:
Zorlanmış 2 birim hassasiyetli sayısal . Para birimini temsil etmek için asla float veya float benzeri veri türü kullanmayın, çünkü bunu yaparsanız, finansal raporun alt satır rakamı + veya - birkaç dolar yanlış olduğunda insanlar mutsuz olacaklar.
Para türü, söyleyebileceğim kadarıyla tarihsel nedenlerden dolayı bırakıldı.
scale - precision
numeric(3,2)en fazla saklayabilecek9.99 3-2 = 1
Kaynağınız hiçbir şekilde resmi değil. 2011 yılına dayanıyor ve yazarları bile tanımıyorum. Para türü resmi olarak "cesareti kırılmış" olsaydı, PostgreSQL bunu kılavuzda söylerdi - ki öyle değildir .
Daha resmi bir kaynak için , D'Arcy JM Cain (para türünün orijinal yazarı) ve Tom Lane gibi çekirdek geliştiricilerin ifadelerini içeren bu konuyu pgsql-general'de (sadece bu haftadan itibaren!) Okuyun:
Son sürümlerdeki iyileştirmelerle ilgili yanıtlar (ve yorumlar!):
Temel olarak, money(çok sınırlı) kullanımları vardır. Postgres Wiki büyük ölçüde, bunu önlemek olanlar dar tanımlanmış durumlar hariç öneriyor. Avantajı fazla numericolan performans .
decimalsadece numericPostgres için bir takma addır ve parasal veriler için yaygın olarak kullanılır, "keyfi bir hassasiyet" türüdür. Kılavuz :
Tür
numeric, çok sayıda basamaklı sayıları saklayabilir. Özellikle parasal miktarların ve kesinliğin gerekli olduğu diğer miktarların depolanması için tavsiye edilir.
Şahsen, integereğer kesirli Sentler asla gerçekleşmezse (temelde paranın mantıklı olduğu yerde) para birimini Sent'i temsil edecek şekilde saklamayı seviyorum . Bu, belirtilen diğer seçeneklerden daha etkilidir.
moneytürün aslında kullanımdan kaldırıldığı 2007 tarihli bir iş parçacığına . Sorunlar giderildi ve tür, sonraki sürümlerde geri eklendi. Şahsen ben para birimini integerCents'i temsil ettiği için saklamayı seviyorum .
Seçimleriniz:
bigint: miktarı sent olarak saklayın. EFTPOS işlemlerinin kullandığı şey budur.decimal(12,2): miktarı tam olarak iki ondalık basamakla saklayın. Bu, çoğu genel muhasebe yazılımının kullandığı şeydir.float: berbat fikir - yetersiz doğruluk. Saf geliştiricilerin kullandığı budur.Seçenek 2, en yaygın ve birlikte çalışması en kolay olanıdır. Hassasiyeti (örneğimde 12, toplamda 12 basamak anlamına gelir) sizin için en uygun şekilde büyük veya küçük yapın.
Bir hesaplamanın sonucu olan birden fazla işlemi (örneğin, bir döviz kurunu içeren) ticari anlamı olan tek bir değerde topluyorsanız, kesin bir makro değer sağlamak için kesinliğin daha yüksek olması gerektiğini unutmayın; gibi bir şey kullanmayı düşünün, decimal(18, 8)böylece toplam doğru olur ve tek tek değerler görüntüleme için yüzde hassasiyetine yuvarlanabilir.
numeric(15,4)ya numeric(15,6)iyi bir fikirdir.
Tüm parasal alanlarımı şu şekilde tutuyorum:
numeric(15,6)
Bu kadar çok ondalık basamağa sahip olmak aşırı görünüyor, ancak en ufak bir şansınız olsa bile, birden fazla para birimiyle uğraşmanız gerekecek, dönüştürme için bu kadar hassaslığa ihtiyacınız olacak. Bir kullanıcıya ne sunarsam sunayım, her zaman ABD Doları'na kaydediyorum. Bu şekilde, ilgili günün dönüştürme oranı göz önüne alındığında, başka bir para birimine kolayca dönüşebilirim.
Tek bir para biriminden başka bir şey yapmazsanız, buradaki en kötü şey, sıfırları saklamak için biraz alan harcamış olmanızdır.
bigintMikro dolar (veya benzer bir ana para birimi) kullanmanızı öneririm. Mikro, 1 milyonuncu anlamına gelir, yani 1 mikro dolar = 0,000001 dolar.
numeric(15,6)başka bir cevapta önerildi?
bigint. Developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… var, ancak sınırlı destek (şimdilik) ve uyarılarla birlikte geliyor (örneğin, para birimi dönüştürme yaparken kolayca bir float ile çarpamazsınız) . Mikro dolar kullanarak bir JS tamsayısında depolayabileceğiniz maksimum tutarın 9 milyar dolar olduğu göz önüne alındığında, bu muhtemelen çoğu durumda hala iyidir.
BigIntPara birimini en küçük para biriminde parasal değeri temsil eden pozitif bir tam sayı olarak saklamak için kullanın (ör. 1,00 $ depolamak için 100 sent veya ¥ 100 (Japon yeni, sıfır ondalık para birimi) depolamak için 100 sent. Stripe bunu yapar - bir küresel e-ticaret için en önemli finansal hizmet şirketleri.