2016-04-04 23 views
3

Bir LongDisimal'e bir long (Object 'longValueToConvert' değişkeninde bulunan) dönüştürmem gerekiyor.BigDecimal'e dönüştürmeden önce Long to String

Böyle bir şey yapardı:

new BigDecimal(longValueToConvert) 

Ama bu döküm dönüşüm hataları neden olabilir okudum ve bunu kullanmadan önce bir String Uzun döküm için tercih olduğunu BigDecimal kurucu.

new BigDecimal(longValueToConvert.toString()) 

İlk mi yoksa ikincisi mi tercih edilir? Java kullanıyorum.

+0

Kodda hiçbir yayın yok ve hayır, dönüştürme hatasına neden olmaz. –

cevap

11

Yanlış duydunuz. BigDecimal(long) yapıcısından dönüşüm hatası yoktur. Bir long tam olarak temsil edilebilir ve bunun dışında bir BigDecimal yapma sorunu yoktur.

Yalnızca BigDecimal(double) yapıcısını kullandığınızda dikkatli olmanız gerekir. Bunun nedeni, bazı double değerlerinin tam olarak temsil edilememesidir. Belge:

Bu kurucunun sonuçları bir şekilde tahmin edilemez olabilir. Java'da new BigDecimal(0.1) yazmanın 0.1 [...] ile tam olarak eşit olan BigDecimal oluşturduğunu varsayabiliriz, ancak aslında 0.1000000000000000055511151231257827021181583404541015625'a eşittir. Bunun nedeni, 0.1'un tam olarak bir double [...] olarak temsil edilememesidir.

String yapıcı, diğer taraftan, mükemmel öngörülebilir: new BigDecimal("0.1") yazma bir beklendiği gibi, 0.1 tam olarak eşit olan bir BigDecimal oluşturur. Bu nedenle, genellikle String kurucusunun buna göre kullanılması önerilir.

+2

Ayrıca, her zaman yapmadıkları için [fabrika yöntemleri] (https://docs.oracle.com/javase/8/docs/api/java/math/BigDecimal.html#valueOf-long-int-) tercih edilir. yeni bir nesne oluştur. – bcsb1001

1

Bu deneyebilirsiniz: Bu iyi çalışır

new BigDecimal(longValueToConvert.longValue()) 

. Kayan nokta sayılarını orada hassas olarak gösterdiğinde endişenizin olması gerektiğine inanıyorum. Örneğin. BigDecimal (double) veya BigDecimal(float) yapıcılarını kullanırken. Bu senaryoların var mı? Ayrıca, burada size her şeyi anlatıyor. Herhangi bir kayan nokta numarası için Long bir sorun değildir, ancak diğer yönlerden gelen bakım gerektirir.

+1

Bu işe yaramazsa, sonuç "Yeni BigDecimal (longValueToConvert)' –

+0

* ile aynı olacaktır. "[Çevirme a] herhangi bir kayan nokta uzunluğuna kadar uzun bir sorun değil" * - Aslında, bir "long" a dönüştürmek "float" veya "double" * * hassaslık kaybına neden olabilir. –

+0

Neden uzun bir süreye çeviriyorsunuz? Bana pek bir şey ifade etmiyor. –

İlgili konular