質問

私は比べもの通貨価値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');
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top