1
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
4

2 に答える 2

1

演算の順序が異なると、浮動小数点の 2 進丸め誤差が異なる方法で伝播しているように見えます。Decimal 型を使用すると、「それほど驚くべきことではありませんが」結果が遅くなる可能性があります。

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

浮動小数点型と 10 進数型の違いをまだ理解していない場合は、http: //docs.sun.com/source/806-3568/ncg_goldberg.htmlをお読みください。

または、より平易な英語を好む場合: http://floating-point-gui.de/

于 2010-08-27T17:26:43.573 に答える
0

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

きっと3.2000000001どこかに入ってくるような変なものがあるに違いない。もしかしてデータベースから?

チッ!
トーマス

于 2010-08-27T15:25:44.743 に答える