単純な質問なのですが
var
iSuryoKei: Integer;
dblSuryoKei: Double;
begin
iSuryoKei := Trunc(dblSuryoKei);
dblSuryoKeiが1の場合は、iSuryoKeiも1になりますよね。
デバックしているとiSuryoKei = 0 になってしまいます。
これってどういうことでしょうか?
デバッグは詳しくありませんが、
変数というのは不要になれば破棄されますし、
そもそも使われていなければコンパイラに無視されます。
結果が間違ってなければ気にする問題ではないです。
下記のようなに実際に使っています
Edit1.Text := 5;
Edit2.Text := 1;
Edit3.Text := 1;
Edit4.Text := 1;
Edit5.Text := 1;
Edit6.Text := 1;
この場合は、Edit7.Text := 0;
Edit1.Text := 1;
Edit2.Text := 1;
Edit3.Text := 1;
Edit4.Text := 1;
Edit5.Text := 1;
Edit6.Text := 5;
この場合は、Edit7.Text := 1;
いったいどういう事なんでしょうか?
[検証ソース]
var
i: Real;
begin
i := StrToInt(Edit1.Text) * 0.1;
i := i + StrToInt(Edit2.Text) * 0.1;
i := i + StrToInt(Edit3.Text) * 0.1;
i := i + StrToInt(Edit4.Text) * 0.1;
i := i + StrToInt(Edit5.Text) * 0.1;
i := i + StrToInt(Edit6.Text) * 0.1;
Edit7.Text := IntToStr(Trunc(i));
浮動小数の誤差です。
その用途だとRound()を使ってください。
どうしてもTrunc()を使いたい場合があると思いますが、そういう時は
r := r + 0.000000000001;
と自分の扱う計算精度の限界より小さい値を変換直前に加えるという手もあります。
浮動小数の計算精度については色々なところで解説されてますのでググッてください。
http://www.cc.kyoto-su.ac.jp/~yamada/programming/float.html
ちなみに、変数iは通常、整数(Integer)のiですんで他の人が読むと混乱します。
どうしても誤差がでるようなので
小数は10倍し整数で処理するようにします。
小数点以下4桁までの精度しか必要としないなら、Currency型を使えば誤差は出ませんよ。
編集 削除