Diğerlerinin de belirttiği gibi, BigDecimal
11.4'ün tam bir temsilini istiyorsanız, muhtemelen sınıfı kullanmak isteyeceksiniz.
Şimdi, bunun neden olduğuna dair küçük bir açıklama:
float
Ve double
Java ilkel türleri vardır kayan nokta sayısı fraksiyonu ve bir üs bir ikili temsili olarak depolanır numaraları.
Daha spesifik olarak, tür gibi çift kesinlikli kayar nokta değeri double
64 bitlik bir değerdir, burada:
- 1 bit işareti belirtir (pozitif veya negatif).
- Üs için 11 bit.
- Anlamlı basamaklar için 52 bit (ikili olarak kesirli kısım).
Bu parçalar, double
bir değerin temsilini üretmek için birleştirilir .
(Kaynak: Wikipedia: Çift hassasiyet )
Kayan nokta değerlerinin Java'da nasıl işlendiğine ilişkin ayrıntılı bir açıklama için bkz. Bölüm 4.2.3: Kayan Nokta Türleri, Biçimleri ve Java Dili Belirtiminin Değerleri .
byte
, char
, int
, long
Türleri vardır sabit nokta numaralarının tam representions olan sayılar,. Sabit nokta numaralarının aksine, kayan nokta sayıları bazen ("çoğu zaman" varsaymak güvenlidir) bir sayının tam bir temsilini döndüremeyecektir. 11.399999999999
Sonuç olarak bununla sonuçlanmanızın nedeni budur 5.6 + 5.8
.
Tam olarak 1.5 veya 150.1005 gibi bir değere ihtiyaç duyduğunuzda, sayıyı tam olarak temsil edebilecek sabit nokta türlerinden birini kullanmak istersiniz.
Zaten birkaç kez bahsedildiği gibi, Java BigDecimal
çok büyük sayıları ve çok küçük sayıları işleyecek bir sınıfa sahiptir.
BigDecimal
Sınıfın Java API Başvurusu'ndan :
Değişmez, rasgele kesinlikli imzalı ondalık sayılar. BigDecimal, rasgele bir hassas tam sayı ölçeklenmemiş değer ve 32 bit tam sayı ölçeğinden oluşur. Sıfır veya pozitifse, ölçek ondalık virgülünün sağındaki basamak sayısıdır. Negatifse, sayının ölçeklendirilmemiş değeri, ölçeğin reddinin gücüyle on ile çarpılır. Bu nedenle BigDecimal tarafından temsil edilen sayının değeri (ölçeklenmemişDeğeri × 10 ^ ölçek) 'dir.
Kayan Taşma ile ilgili kayan nokta sayıları ve kesinliği ile ilgili birçok soru vardır. İlginizi çekebilecek ilgili soruların listesi:
Kayan nokta sayılarının gerçekten cesur ayrıntılarına inmek istiyorsanız, Her Bilgisayar Bilimcisinin Kayan Nokta Aritmetiği Hakkında Bilmesi Gerekenler'e bir göz atın .