質問
int(0.4 * 10.0)
が 4
であるのに int((2.4-2.0)* 10.0)
が< code> 3 ?
そして、 4
の入手方法も説明してください。つまり、本当に int(System.Math.Round((2.4-2.0)* 10.0))
を実行する必要がありますか?
非常に単純なものにとってはItいだけです。
解決
2.4-2.0の二重表現は0.399999999999です。数値をintに変換すると、小数部分が切り捨てられるため、3.999999999は3に切り捨てられます。
他のヒント
そして、4を取得する方法も説明してください。つまり、本当にやらなければならないのですか
int(System.Math.Round((2.4-2.0)* 10.0))
非常にシンプルなものにとっては非常にいです。
もちろん、単に定義するだけ
let round x = int System.Math.Round(x)
実際には、.Netには、数値を小数として正確に表現できる場合に、この問題を解決する decimal
データ型があります。
2.4m - 2.0m == 0.4m
2.4 - 2.0 != 0.4
float
の数値を int
に変換するには、次を使用します。
let i = Convert.ToInt32(f)
浮動小数点数は無限精度ではありません。一部の数値は完全に表すことができます(2のべき乗を含むもの、たとえば1、1 / 2 = 0.5、1 / 4 = 0.25など)およびその他の数値はできません(たとえば、1/3を正確に分解して有限シーケンスにできません) 2のべき乗)。多くの場合、無限級数の終わりを切り刻むと、数値のエンコードされたバージョンがその真の値よりわずかに小さくなります。
これを(int)演算子が丸めるのではなく切り捨てるという事実と組み合わせると、すべきの操作が4.0になり、代わりに3.999999999991になり、3になる場合に実行できます。
float / doubleをintに変換しようとするときはいつでも、使用する演算子を切り捨てる(切り捨て)、切り上げる、または最も近い値に丸める
>これは浮動小数点表現の問題であるため、これはF#だけでなく、C#および(IIRC)Javaおよびその他の言語でも当てはまります。