51

私が次のことをしたら

 println(3/4)
 >0

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

4

3 に答える 3

66

数字を入力する場合は、そのうちの少なくとも1つをfloatとして入力するだけです(私はあなたがそうではFloatないことを意味すると思いますDouble):

println(3f/4)

すでに変数に数値がある場合は、それらの少なくとも1つを次のように変換します。toFloat

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

(いずれの場合も、少なくとも1つある場合、コンパイラーはもう1つFloatを一致するように変換します。)

于 2012-06-20T16:07:24.930 に答える
32

これらの助けはありますか?

println(3.0/4.0)
println(3.toDouble/4.toDouble)
于 2012-06-20T16:06:13.720 に答える
9

プリミティブ型 (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 に頼ります (仕方)。

于 2012-06-21T22:43:54.407 に答える