Kısa bir süre önce, birden fazla para biriminde değerleri ele alması ve bunlar arasında dönüşüm gerçekleştirmesi gereken bir sistem uyguladık ve birkaç şeyi zor yoldan çözdük.
PARA İÇİN ASLA YÜZER NOKTALARI KULLANMAYIN
Kayan nokta aritmetiği, bir şeyleri mahvedinceye kadar fark edilmeyebilecek yanlışlıklar getirir. Tüm değerler tamsayı veya sabit ondalık tür olarak depolanmalıdır ve sabit ondalık tür kullanmayı seçerseniz, bu türün başlık altında ne yaptığını tam olarak anladığınızdan emin olun (yani dahili olarak bir tamsayı veya kayan nokta kullanıyor mu? ) kullanımı önerilir.
Hesaplamalar veya dönüşümler yapmanız gerektiğinde:
- Değerleri kayan noktaya dönüştürme
- Yeni değeri hesapla
- Sayıyı yuvarlayın ve tekrar tamsayıya dönüştürün
Bir kayan nokta sayısını 3. adımda tekrar bir tam sayıya dönüştürürken, sadece dökmeyin - önce yuvarlamak için bir matematik işlevi kullanın. Bu genellikle round
, özel durumlarda floor
veya olsa da, olacaktır ceil
. Farkı öğrenin ve dikkatlice seçin.
Bir sayının türünü değerin yanında sakla
Yalnızca bir para birimini işliyorsanız bu sizin için önemli olmayabilir, ancak birden fazla para birimini ele almamız bizim için önemliydi. USD, GBP, JPY, EUR gibi bir para birimi için 3 karakterlik kodu kullandık.
Duruma bağlı olarak, saklamak da yardımcı olabilir:
- Sayının vergiden önce mi yoksa sonra mı olduğu (ve vergi oranının ne olduğu)
- Sayının bir dönüşümün sonucu olup olmadığı (ve dönüştürüldüğünden)
Karşılaştığınız sayıların doğruluk sınırlarını öğrenin
Gerçek değerler için, para biriminin en küçük birimi kadar kesin olmak istersiniz. Bu, bir kuruş, bir kuruş, bir yen, bir fen, vs.'den daha küçük değerleriniz olmadığı anlamına gelir.
Dahili olarak, daha küçük değerlerle başa çıkmayı seçebilirsiniz, bu durumda farklı bir para birimi değeri türüdür . Kodunuzun hangisinin hangisi olduğunu bilmediğinden emin olun. Burada bile kayan nokta değerleri kullanmaktan kaçının.
Tüm bu kuralları bir araya getirerek aşağıdaki kurallara karar verdik. Çalışan kodda, para birimleri en küçük birim için bir tamsayı kullanılarak saklanır.
class Currency {
String code; // eg "USD"
int value; // eg 2500
boolean converted;
}
class Price {
Currency grossValue;
Currency netValue;
Tax taxRate;
}
Veritabanında, değerler aşağıdaki biçimde bir dize olarak saklanır:
USD:2500
25,00 dolarlık değeri depolar. Bunu sadece para birimleriyle ilgilenen kodun veritabanı katmanının içinde olması gerekmediği için yapabildik, böylece tüm değerler önce belleğe dönüştürülebilir. Diğer durumlar şüphesiz kendilerini diğer çözümlere borçlandıracaktır.
Daha önce açıklığa kavuşturamazsam, şamandıra kullanmayın!