質問

Assert.Equal(1000000.0, table.Convert("g", "mcg", 1.0)); // Pass
Assert.Equal(2000000.0, table.Convert("g", "mcg", 2.0)); // Pass
Assert.Equal(3200000.0, table.Convert("g", "mcg", 3.2)); // Fail
// The failing one is equal to doing the following calculation, which fails also:
Assert.Equal(3200000.0, 3.2 * 1.0 / (1.0 / 1000000.0));  // Fail
Assert.Equal(3200000.0, 3.2 * (1.0 / (1.0 / 1000000.0)));// Pass, WTF?!?!
===================================================================    
Assert.Equal() Failure
    Expected: 3200000
    Actual:   3200000
役に立ちましたか?

解決

操作の順序が異なると、浮動小数点バイナリの丸めエラーが異なる方法で伝播しているように見えます。 「あまり驚くほど」ではありませんが、小数型では潜在的に遅い結果を得ることができます。

3.2 * 1.0 / (1.0 / 1000000.0) -> 3200000.0000000005

(試す (3.2 * 1.0 / (1.0 / 1000000.0) ).ToString("R");

3.2 * (1.0 / (1.0 / 1000000.0)) -> 3200000.0

浮遊点と小数タイプの違いをまだ理解していない場合は、次のことをお読みください。 http://docs.sun.com/source/806-3568/ncg_goldberg.html

または、あなたがより平凡な英語で何かを好むなら:http://floating-point-gui.de/

他のヒント

Yoeはあなたのコードスニペットからそれを見ることができませんが、あなたの最初の行(通過した行)があるという事実と関係があると確信しています .0, 、一方、失敗したものには、コンマ後にゼロに不平等なものがあります。

奇妙なものがあると確信しています 3.2000000001 どこかに来る。多分データベースから?

hth!
トーマス

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top