2

次のテストが与えられます:

[Fact]
public void FactMethodName()
{
    var d = 6.4133;
    var actual = d.ToString("R");
    Assert.Equal("6.4133", actual);
}

x86では渡されますが、AnyCPUまたはx64では渡されません。

Assert.Equal() Failure
Position: First difference is at position 5
Expected: 6.4133
Actual:   6.4132999999999996

問題は、なぜそれが起こるのかということです。すべてのdouble値がこのように動作するわけではないことに注意してください。

浮動小数点の問題について理解しています。ウィキペディアを指す必要はありません。テストが正しくないことを指摘する必要はありません-それは問題を示しているだけです-必要に応じてに変更してConsole.WriteLine(..);ください。

更新これらの詳細は無関係であることが判明したため、テストランナーの言及を削除しました。

4

2 に答える 2

2

秘密は「R」フォーマットの文字列を使用することにあると思います(これについてはもっと見る

「この指定子を使用してSingleまたはDoubleの値をフォーマットする場合、最初に一般的なフォーマットを使用してテストされます。Doubleの場合は15桁の精度、Singleの場合は7桁の精度です。値が正常に解析されて同じ数値に戻された場合値の場合、一般的なフォーマット指定子を使用してフォーマットされます。値が正常に解析されて同じ数値に戻らない場合は、Doubleの場合は17桁の精度、Singleの場合は9桁の精度を使用してフォーマットされます。」

于 2012-09-18T16:23:50.400 に答える
-1

Raj と ja72 が指摘しているように、問題は数値の丸めに関係しており、テストは問題の例にすぎませんが、実際のテストでは、これらの論理エラーを回避する必要があります。特に、文字列へのキャストや、テストの成功を損なう可能性のある副作用を持つ可能性のある他のメソッドの呼び出しは避けてください。

残念ながら、これは一般的に脆弱なテストと呼ばれます。一部のマシンでは、一部の時間で動作します。開発チームで作業している場合 (特に、ビルド サーバーまたはオフショア チーム、またはニア ショア チーム) で作業している場合、このようなテストは Works on my machine 賞に値する可能性があります。

于 2012-09-17T14:03:54.087 に答える