Java'da parasal değerleri temsil etmek için BigDecimal'in önerilen en iyi uygulama olduğunu anlıyorum. Ne kullaniyorsun? Bunun yerine kullanmayı tercih ettiğiniz daha iyi bir kütüphane var mı?
Java'da parasal değerleri temsil etmek için BigDecimal'in önerilen en iyi uygulama olduğunu anlıyorum. Ne kullaniyorsun? Bunun yerine kullanmayı tercih ettiğiniz daha iyi bir kütüphane var mı?
Yanıtlar:
BigDecimal
tüm yol. Bazı insanların kendi sınıflarını Cash
veya Money
para birimiyle nakit değeri içeren sınıfları yarattığını duydum , ancak cilt altında hala bir BigDecimal
, muhtemelen BigDecimal.ROUND_HALF_EVEN
yuvarlama ile.
Düzenleme: Don'un cevabında belirttiği gibi, timeandmoney gibi açık kaynaklı projeler var ve geliştiricilerin tekerleği yeniden icat etmek zorunda kalmalarını önlemeye çalıştıkları için onları alkışlarken, bir ön alfa kitaplığına yeterince güvenmiyorum. bir üretim ortamında. Eğer kaputun altında kazmak yanında, eğer görürsünüz kullandıkları BigDecimal
da .
Buraya arama motorları aracılığıyla gelen kişilerin JodaMoney hakkında bilgi sahibi olmaları yararlı olabilir: http://www.joda.org/joda-money/ .
BigDecimal
, kaputun altında olduğuna sevindim !
Burada fikrimi ifade etmiyorum, ancak BigDecimal aleyhine birinin muhtemelen atması gereken oldukça iyi argümanlar var:
http://lemnik.wordpress.com/2011/03/25/bigdecimal-and-your-money/
Daha önce karşılaştığım kullanışlı bir kütüphane Joda-Money kütüphanesi. Uygulamalarından biri gerçekten BigDecimal'e dayanmaktadır. Para birimleri için ISO-4217 spesifikasyonunu temel alır ve özelleştirilmiş bir para birimi listesini (CVS aracılığıyla yüklenir) destekleyebilir.
Bu kitaplık, değişiklik gerektiğinde hızlı bir şekilde geçilebilecek az sayıda dosyaya sahiptir. Joda-Money, Apache 2.0 lisansı altında yayınlanmaktadır.
Sadece dolar ve sent kullanıyorsanız, uzun (2 ondalık basamak ile ofset) kullanırım. Daha fazla ayrıntıya ihtiyacınız varsa, büyük ondalık en iyi yol olabilir.
Her iki durumda da, muhtemelen sınıfı doğru biçimi kullanan bir .toString () 'e sahip olacak şekilde ve ortaya çıkabilecek diğer yöntemleri koymak için bir yer olarak genişletebilirim (Uzun bir süre için, çarpma ve bölme, ondalık sayı değilse ayarlandı)
Ayrıca, kendi sınıfınızı ve arabiriminizi tanımlamayı kullanırsanız, uygulamayı istediğiniz zaman değiştirebilirsiniz.
BigDecimal
veya başka bir sabit nokta temsili genellikle para için gerekli olan şeydir.
Kayan nokta ( Double
, Float
) gösterimleri ve hesaplamaları kesin değildir ve hatalı sonuçlara yol açar.
Zaman ve parayla uğraşırken çok dikkatli olmalısın.
Parayla çalışırken umarım herkes şamandıra veya duble kullanmamayı bilmelidir.
Ama BigDecimal hakkında emin değilim.
Çoğu durumda, sadece int veya long cinsinden sentleri takip ederseniz, iyi olacaksınız. Bu şekilde asla ondalık basamakla uğraşmazsınız.
Yalnızca yazdırdığınızda dolar görüntülersiniz. Her zaman tamsayı kullanarak dahili sentlerle çalışın. Bölmeniz gerekiyorsa veya Math.abs () kullanmanız gerekiyorsa, bu zor olabilir.
Bununla birlikte, yarım sent, hatta bir sentin yüzde biri umurunda olabilir. Bunu yapmanın iyi bir yolunun ne olduğunu bilmiyorum. Sadece binde sent ile uğraşmanız ve uzun bir süre kullanmanız gerekebilir. Ya da belki BigDecimal kullanmaya zorlanacaksınız
Bunun üzerine çok daha fazla okuma yapardım, ancak parayı temsil etmek için float veya double kullanmaktan bahsetmeye başlayan herkesi görmezden gelin. Sadece bela istiyorlar.
Tavsiyemin tam olmadığını hissediyorum, bu yüzden lütfen daha fazlasını yazın. Tehlikeli tiplerle uğraşıyorsun!
Para sınıfı oluşturmak, gidilecek yoldur. Altında BigDecimal (veya hatta bir int) kullanma. Ardından, yuvarlama kuralını tanımlamak için Currency sınıfını kullanma.
Maalesef operatörün aşırı yüklenmesi olmadan Java, bu tür temel türlerin oluşturulmasını oldukça rahatsız eder.
Daha iyi bir kütüphane, zaman ve para var . IMO, bu 2 kavramı temsil etmek için JDK tarafından sağlanan kitaplıklardan çok daha üstündür.
Kesinlikle BigDecimal değil. Yuvarlama ve sunum için endişelenmeniz gereken çok sayıda özel kural vardır.
Martin Fowler, para birimi tutarlarını temsil etmek için özel bir Para sınıfının uygulanmasını önerir ve bu aynı zamanda para birimi dönüştürme kurallarını da uygular.
Hey, işte BigDecimal hakkında çok ilginç bir makale ve neden bazen çiftler yerine kullanıldığına dair açıklayıcı bir örnek. BigDecimal Eğitimi .
Nihayetinde bir para birimi değeri görüntülerken DecimalFormat sınıfını kullanabilirsiniz. Yerelleştirme desteği sağlar ve oldukça genişletilebilir.
BigDecimal'i, yukarıda bahsettiğim gibi bir para birimi olan Money sınıfına dahil ederdim. Önemli olan, aşırı miktarda birim testi yapmanız ve özellikle farklı para birimleriyle çalışmanızdır. Ayrıca, bir dizi alan uygun bir kurucu veya aynı şeyi yapan bir fabrika yöntemi eklerseniz, testlerinizi şöyle bir şey yazabilmeniz için iyi bir fikirdir:
assertEquals(Money.create("100.0 USD").add("10 GBP"),Money.create("116 USD"));
Her zaman kısıtlamalar ve ayrıntılar vardır. Aşağıdaki makalede ana hatlarıyla belirtilen ince sorunları takdir etmek için yeterli deneyime sahip olmayan herkes, gerçek dünyadaki finansal verilerle uğraşmadan önce ciddi şekilde yeniden düşünmelidir:
http://lemnik.wordpress.com/2011/03/25/bigdecimal-and-your-money
BigDecimal, bulmacanın tek doğru temsili veya tek parçası değildir. Belirli koşullar altında, tamsayı olarak depolanan sentlerle desteklenen bir Money sınıfı kullanmak yeterli olabilir ve BigDecimal'den çok daha hızlı olacaktır. Evet, bu, para birimi ve limit miktarları olarak dolar kullanımını ima eder, ancak bu tür kısıtlamalar birçok kullanım durumu için mükemmel şekilde kabul edilebilir ve tüm para birimlerinin yuvarlama ve alt para birimleri için özel durumları vardır, bu nedenle "evrensel" bir çözüm yoktur.