2012-06-20 17 views

cevap

21

Bu yardımlardan herhangi biri?

println(3.0/4.0) 
println(3.toDouble/4.toDouble) 
41

numarayı yazarak ediyorsanız, sadece bir float olarak bunlardan en az birini yazın (Sana Float değil Double demek varsayalım):

println(3f/4) 

Zaten değişkenlerde sayıları varsa en azından varsa, her durumda (toFloat

val x = 3 
println(x.toFloat/4) 

ile bunlardan en az birini dönüştürmek, derleyicidiğer dönüştürürile eşleşiyor.)

+3

Muhtemelen bir float yerine bir çift kullanmak istersiniz. –

6

İlkel türler (Int, Float, Double vb.) Için Scala, Java'daki kuralları izler.

Tamsayılar 3, 4, vb. Yazarsanız, ifadeleri tamsayı olarak kalır. Sonuç bir tamsayıdır böylece Yani

println(3/4) 

iki tamsayılar oluşan bir ifade vardır: değerlerden herhangi yerine Int bir Float olması durumda 0.

, tüm ifade bir olmayı genişler Float. Aynı şey bir Double için de geçerlidir. Bu genişleme neredeyse tamamen otomatik olarak gerçekleşir - sadece derleyiciye istediğin şeyin ipucunu vermelisin, ör.

println(3f/4) 

Float için genişler ve

println(3.0/4) 

Çift için genişler.

Bu dil özelliklerini gerçek programlarda kullanırken, her zaman ortaya çıkabilecek hassasiyet kaybını düşünün. Bu durumda ondalık kesir kaybına neden olan tamsayı bölümünü zaten fark ettiniz. Ama burada gösterilmektedir kayan nokta için farklı bir vaka var:

gerçek sonuç tutun böylece mümkün değildir ikili kesirler, ondalık kesirler değil ve sahip bir ikili gösterimi (IEEE-754 standardını kullanarak) tutulur
println(4f/3) 

4f/3 küçük bir hata olmadan.

scala> println(100f/99f * 99) 
99.99999 

100 yazdırmayı bekleyebilirsiniz. Bazen bu önemli değil ve bazen de oluyor. Parasal değerlerle uğraşırken çok önemli olan çok yaygın bir durumdur. Başparmak kuralı DAİMA KAÇININ KAÇIRILMASI ve para için iki katıdır: yerine BigDecimal kullanın ya da sadece uzun bir peni olarak tutmayın ya da bazen Dizeler'e başvurun (BigDecimal ile birlikte güzel bir şekilde oynayın. yön).

İlgili konular