私がscalaインタープリター内の値をチェックしているとき:
scala> 1==1.0000000000000001
res1: Boolean = true
scala> 1==1.000000000000001
res2: Boolean = false
ここでは、「scalaコンパイラがこれらを整数または浮動小数点またはdouble(および比較)としてどのように解釈するか」に関連する明確な見解が得られていません。
私がscalaインタープリター内の値をチェックしているとき:
scala> 1==1.0000000000000001
res1: Boolean = true
scala> 1==1.000000000000001
res2: Boolean = false
ここでは、「scalaコンパイラがこれらを整数または浮動小数点またはdouble(および比較)としてどのように解釈するか」に関連する明確な見解が得られていません。
これは実際にはScalaに関連するものではなく、ieee-754浮動小数点演算の問題です。まず第一に、それと比較するInt
と(常に安全)Double
にキャストさInt
れます。Double
2番目のケースは明らかです-値は異なります。
最初のケースで発生するのは、Double
typeが有効数字をそれほど多く格納できないため(この場合は17、64ビット浮動小数点は最大16桁の10進数を格納できる)、値をに丸めます1
。そして1 == 1
。