web-dev-qa-db-ja.com

Scala 2つの整数を除算し、浮動小数点の結果を取得する

私が次のことをすれば

 println(3/4)
 >0

整数ではなく小数の答えを取得したいと思います。実際のコードで印刷する方法のため、可能であればprintln内でキャストすることを好みます。

39
richsoni

数値を入力する場合は、少なくとも1つをfloatとして入力してください(FloatではなくDoubleを意味すると仮定します):

println(3f/4)

すでに変数に数値がある場合は、少なくとも1つをtoFloatで変換します

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

(いずれの場合も、少なくとも1つがあれば、コンパイラはもう一方をFloatに変換して一致させます。)

54
Rex Kerr

これらの助けのいずれか?

println(3.0/4.0)
println(3.toDouble/4.toDouble)
24
Alex Wilson

プリミティブ型(Int、Float、Doubleなど)の場合、ScalaはJavaのルールに従います。

リテラル整数3、4などを記述する場合、それらの式は整数のままです。そう

println(3/4)

2つの整数で構成される式があるため、結果は整数になります:0。

いずれかの値がIntではなくFloatである場合、式全体が広がり、Floatになります。 Doubleについても同じことが言えます。この拡大はほ​​ぼ完全に自動的に行われます-コンパイラーに必要なヒントを与えるだけです。

println(3f/4)

フロートに拡大し、

println(3.0/4)

ダブルに広がります。

実際のプログラムでこれらの言語機能を使用する場合、発生する可能性のある精度の低下を常に考慮してください。その場合、整数の除算によって小数部が失われることにすでに気付いています。しかし、浮動小数点には別のケースがあり、それを以下に示します。

println(4f/3)

実際の結果は(IEEE754標準を使用した)バイナリ表現で保持されます。これは、小数ではなくバイナリの端数を持つため、小さなエラーなしで4f/3を保持できません。

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

100を印刷することを期待しているかもしれません。これは重要ではない場合もあります。重要なケースの1つは、金銭的価値を扱う場合です。経験則は常に浮動小数点数とお金の倍増を避けることです:代わりにBigDecimalを使用するか、ペンスの数をLongとして保持するか、文字列に頼る場合があります(BigDecimalとうまく機能します。仕方)。

7
Rick-777