Dim d As Double
For i = 1 To 10
d = d + 0.1
Next
MsgBox(d)
MsgBox(d = 1)
MsgBox(1 - d)
誰も私にその理由を説明できますか? d
が1
に設定されているのはなぜですか?
Dim d As Double
For i = 1 To 10
d = d + 0.1
Next
MsgBox(d)
MsgBox(d = 1)
MsgBox(1 - d)
誰も私にその理由を説明できますか? d
が1
に設定されているのはなぜですか?
浮動小数点型と整数型は、バイナリ表現が異なるため、直接比較することはできません。
浮動小数点型として0.1
を10倍加算した結果は、が、に近い値になりますが、正確ではありません。
浮動小数点値を比較する場合、値が異なる可能性がある最小値を使用する必要がありますが、それでも同じ値と見なされます(通常、この値はイプシロンと呼ばれます)。この値はアプリケーションによって異なります。
詳しくは、What Every Computer Scientist Should Know About Floating-Point Arithmeticをお読みください。 1.0
に1
をcomaringについては
- これらは、さまざまな種類がありますので、お互いに比較することはありません。
これは、doubleは常に値の近似値であり、正確な値そのもの(浮動小数点値など)ではないためです。正確な10進値が必要な場合は、代わりに10進数を使用します。
コントラスト:
Dim d As Decimal
For i = 1 To 10
d = d + 0.1
Next
MsgBox(1)
MsgBox(d = 1)
MsgBox(1 - d)
0.1(1/10)は、バイナリに変換繰り返し分数ある:
.0001100110011001100110011001100110011 .....
1/3を小数として表示しようとするようなものでしょう。正確に行うことはできません。
私は..を参照して、なぜdが1に設定されているのですか?それがちょうど1でない場合... – Bartzilla
これは[ieee754]の機能です(http://en.wikipedia.org/wiki/IEEE_754-2008) –
http://stackoverflow.com/questions/1530069/comparing-floating-point-values –