Bunlar iki ayrı soru: "Ne için kullanmalıyım BigDecimal?" ve "Genel olarak ne yapmalıyım?"
Çünkü BigDecimal: bu biraz aldatıcı çünkü aynı şeyi yapmıyorlar . BigDecimal.valueOf(double)kullanacak kanonik Stringtemsil arasında doubleörneğini geçirilen değeri BigDecimalnesnesi. Başka bir deyişle: BigDecimalNesnenin değeri, yaptığınız zaman gördüğünüz şey olacaktır System.out.println(d).
new BigDecimal(d)Ancak kullanırsanız BigDecimal, doubledeğeri olabildiğince doğru bir şekilde temsil etmeye çalışacaktır . Bu genellikle istediğinizden çok daha fazla rakamın depolanmasına neden olur. Açıkçası, bundan daha doğru valueOf()ama çok daha az sezgisel.
JavaDoc'ta bunun güzel bir açıklaması var:
Bu kurucunun sonuçları bir şekilde tahmin edilemez olabilir. new BigDecimal(0.1)Java'da yazmanın BigDecimaltam olarak 0.1'e eşit olan bir a oluşturduğu varsayılabilir (ölçeklenmemiş 1 değeri, 1 ölçeği), ancak aslında 0.100000000000000000055511151231257827021181583404541015625'e eşittir. Bunun nedeni, 0.1'in tam olarak bir double(veya bu nedenle, herhangi bir sonlu uzunluğun ikili bir kesri) olarak temsil edilememesidir . Bu nedenle, kurucuya iletilen değer, görünüşe bakılmaksızın tam olarak 0.1'e eşit değildir.
Genel olarak, sonuç aynıysa (yani durumunda değil BigDecimal, ancak diğer birçok durumda), o valueOf()zaman tercih edilmelidir: ortak değerlerin önbelleğe alınmasını sağlayabilir (üzerinde görüldüğü gibi Integer.valueOf()) ve hatta önbelleğe alma davranışını değiştirmeden bile değiştirebilir. arayanın değiştirilmesi gerekiyor. newolacak hep , olmasa bile gerekli (: En iyi örnek yeni bir değer örneğini new Boolean(true)vs Boolean.valueOf(true)).