私が次のことをしたら
println(3/4)
>0
整数ではなく小数で答えてほしいです。実際のコードで印刷している方法のため、可能であれば println 内でキャストすることをお勧めします。
私が次のことをしたら
println(3/4)
>0
整数ではなく小数で答えてほしいです。実際のコードで印刷している方法のため、可能であれば println 内でキャストすることをお勧めします。
数字を入力する場合は、そのうちの少なくとも1つをfloatとして入力するだけです(私はあなたがそうではFloat
ないことを意味すると思いますDouble
):
println(3f/4)
すでに変数に数値がある場合は、それらの少なくとも1つを次のように変換します。toFloat
val x = 3
println(x.toFloat/4)
(いずれの場合も、少なくとも1つある場合、コンパイラーはもう1つFloat
を一致するように変換します。)
これらの助けはありますか?
println(3.0/4.0)
println(3.toDouble/4.toDouble)
プリミティブ型 (Int、Float、Double など) については、Scala は Java の規則に従います。
リテラル整数 3、4 などを記述すると、それらの式は整数のままになります。そう
println(3/4)
には 2 つの整数からなる式があるため、結果は整数の 0 になります。
値のいずれかがたまたま Int ではなく Float である場合、式全体が拡張されて Float になります。ダブルの場合も同様です。この拡張はほぼ完全に自動的に行われます - 必要なもののヒントをコンパイラに与えるだけです。
println(3f/4)
Float に広がり、
println(3.0/4)
ダブルに広がります。
これらの言語機能を実際のプログラムで使用する場合は、発生する可能性のある精度の低下を常に考慮してください。その場合、整数除算が小数部の損失を引き起こすことに既に気付いています。しかし、ここに示されている浮動小数点の別のケースがあります。
println(4f/3)
実際の結果は 2 進表現 (IEEE754 標準を使用) で保持されますが、これには小数ではなく 2 進分数が含まれるため、わずかなエラーなしで 4f/3 を保持することはできません。
scala> println(100f/99f * 99)
99.99999
100 を出力すると予想したかもしれません。これは問題にならない場合もあれば、問題になる場合もあります。非常に重要な非常に一般的なケースの 1 つは、金銭的価値を扱う場合です。経験則では、お金のために float と double を常に回避します。代わりに BigDecimal を使用するか、ペンスの数をおそらく Long として保持するか、場合によっては Strings に頼ります (仕方)。