比較の問題DUnit CheckEqualsと通貨のフィールド値
質問
私は比べもの通貨価値DUnitものではないで働くすべてのマ(他人ませんのでご注意ください鉱).
例:
CheckEquals(16.65, SomeCurrencyFieldValue);
金:
expected: <16,65> but was: <16,65>
場合には、以下のに比較して著作物:
var
Temp: Currency;
begin
Temp := 16.65;
CheckEquals(Temp, SomeCurrencyFieldValue);
ここでの問いはなぜ、比較動作しない場していただくための価値に直接CheckEquals方法は?
解決
この問題は、どう Currency
値に変換され Extended
値の実行時に対しどのよう浮動小数点リテラル変換され Extended
値はコンパイルす。場合には変換できないのではないで同じ場合、その値に渡される CheckEquals
ない場合の比較。
このチェックのデバッガのCPU窓かどうかのどちらかの値を通して中間 Double
値によるところ Extended
に備えるための機能。余分な変換に及ぼす影響についても正の値です。
別のこ16.65なrepresentableうとして Extended
価値で は representableうとして Currency
値とします。は Currency
に分類される浮動小数点型では、固定点スケールの64ビット整数です。ことになるだろう根拠を要求する追加の CheckEquals
過負荷にDUnitること。
他のヒント
いたように、これまでとは違っただけありCheckEquals()のための拡張の値はデ2007年dUnitます。ものを使用できること:
procedure CheckEquals(expected, actual: extended; delta: extended;
msg: string = ''); overload; virtual;
や適切なデルタのための通貨の値です。
また同じ問題です。そのようにDllを変更するFPU(プロセッサ制御言葉です。このエラーが発生しません。それは突然が新しい試験を利用する他のユニットの前回のテストスイートが追加されます。場合やソフトウェアのアップデートを設置悪Dll.いについて書いて自分のブログ:
他にもデルフィが含まれてSafeLoadLibrary機能回復の制御言葉です。
この点ものうつの問題は、機械によって異なります。
ここにあることを示唆解
procedure CheckEquals(expected, actual: double; Precision:integer; msg:string ='');overload;virtual;
...
procedure TAbstractTest.CheckEquals(expected, actual: double;
Precision: integer; msg: string);
var
I: Integer;
begin
FCheckCalled := true;
for I := 0 to Precision do begin
Expected := Expected * 10;
Actual := Actual * 10;
end;
if Round(Expected) <> Round(Actual) then
FailNotEquals( IntToStr(Round(Expected)), IntToStr(Round(Actual)), msg, CallerAddr);
end;
いい悪い実装では、こうした"デルタ"といいます。
現在のバージョンのdunit利用できる
procedure CheckEquals(expected, actual: extended; delta: extended; msg: string = ''); overload; virtual;
CheckEquals(0.011,0.01,0.009,'will pass');