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 String
temsil arasında double
örneğini geçirilen değeri BigDecimal
nesnesi. Başka bir deyişle: BigDecimal
Nesnenin 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
, double
değ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 BigDecimal
tam 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. new
olacak hep , olmasa bile gerekli (: En iyi örnek yeni bir değer örneğini new Boolean(true)
vs Boolean.valueOf(true)
).