2012-06-20 15 views
31

bekommen Wenn ich die folgendeScala zwei ganzen Zahlen Teilen und ein Schwimmer Ergebnis

println(3/4) 
>0 

tun würde Ich mag eine Dezimalzahl Antwort anstelle einer ganzen Zahl erhalten. Wegen der Art und Weise, wie ich in meinem tatsächlichen Code drucke, würde ich es vorziehen, innerhalb der println zu casten, wenn das möglich ist.

Antwort

21

Alle diese Hilfe?

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

Wenn Sie die Nummer eingeben sind, geben Sie einfach mindestens eine von ihnen als Schwimmer (ich nehme an, Sie meinen Float nicht Double):

println(3f/4) 

Wenn Sie bereits die Zahlen in Variablen toFloat

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

, mit zumindest einer von ihnen umwandeln (in jedem Fall, wenn Sie mindestens einen haben, wird der Compiler den anderen konvertieren Float passend.)

+3

Wahrscheinlich möchten Sie lieber ein Double als ein Float verwenden. –

6

Für die primitiven Typen (Int, Float, Double usw.) folgt Scala den Regeln in Java.

Wenn Sie die Ganzzahlen 3, 4 usw. schreiben, bleiben ihre Ausdrücke als Ganzzahlen erhalten. So

println(3/4) 

hat einen Ausdruck von zwei ganzen Zahlen aus, so ist das Ergebnis eine ganze Zahl ist: 0.

Wenn einer der Werte geschieht, ein Float anstelle eines Int zu sein, der ganze Ausdruck erweitert ein geworden Schweben. Das gleiche gilt für ein Double. Diese Erweiterung geschieht fast vollständig automatisch - Sie müssen dem Compiler lediglich den Hinweis geben, was Sie wollten, z.

println(3f/4) 

erweitert floaten und

println(3.0/4) 

erweitert zu verdoppeln.

Wenn Sie diese Sprachfeatures in realen Programmen verwenden, denken Sie immer an den Verlust an Genauigkeit, der auftreten kann. Sie haben bereits die ganzzahlige Division bemerkt, die in diesem Fall den Verlust des Dezimalbruches verursacht. Aber es gibt einen anderen Fall für Floating-Point, die hier dargestellt ist:

println(4f/3) 

Das tatsächliche Ergebnis wird in einer binären Darstellung (mit dem IEEE754-Standard) gehalten, die Binärbrüche hat, nicht Dezimalbrüchen, und so nicht in der Lage zu halten, 4f/3 ohne einen kleinen Fehler.

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

Man könnte es drucken erwarten Manchmal ist 100. dies keine Rolle, und manchmal tut es. Ein sehr häufiger Fall, in dem es sehr darauf ankommt, ist der Umgang mit monetären Werten. Die Faustregel lautet: IMMER VERMEIDEN Sie float und double for money: Verwenden Sie stattdessen BigDecimal, oder halten Sie einfach die Anzahl von Pence als Long, oder greifen Sie manchmal auf Strings zurück (die gut mit BigDecimal funktionieren, vorausgesetzt, sie werden nicht als Double-Werte analysiert Weg).

Verwandte Themen