なぜこのXunitテストが失敗するのですか?
-
01-10-2019 - |
質問
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!
トーマス
所属していません StackOverflow