X: Integerで入力→Stringで格納後、実数型に変換したもの
Y: Doubleで入力→Stringで格納後、実数型に変換したもの
Z:=Trunc(X*Y/100)*100として下2桁を'00'にしたいのですが
例えば
X:=100000
Y:=0.015
とした場合
Z:=1500と表示したいんですが、1400で返ってきます。
実数型に変換する際の型変換で上手く行ってないと思われます。
StrToCurrやStrToFloatでは1400でした。
他の手段はありませんでしょうか?
解決方法ではないですが。
実験結果を・・・
procedure TForm1.Button1Click(Sender: TObject);
var
X: Integer;
Y,Z,Tmp: Double;
begin
X:=100000;
Y:=0.015;
Z :=Trunc(X*Y/100); //下2桁を'00'にしたい
Tmp := (X*Y/100);
memo1.Lines.Add(FloattoStr(Z));
memo1.Lines.Add(FloattoStr(Tmp));
memo1.Lines.Add(FloattoStr(Trunc(Tmp)));
end;
memo1 には 14 15 15 と表示されます。
面白いですね〜
うちでも最初は14 15 15と出ていたんですが、今は15 15 15と出ています。
もちろんコピー&ペーストで、memo1の部分をShowMessageに変更。これは最初の結果表示も同じように変更していました。
最初の結果が出たときから、プロジェクトオプションなどは変更なし。
# デバッグ用になっているので、「最適化」のチェックがはずれていたり、デバッグ情報が付加されていたりしますが。
桁落ちにしても、ちょっと不思議な気もします。
Delphi7Pro+WinXPPro
X: Int64;
Y: Double;
begin
X:=10000000000000000;
Y:=0.015;
Memo1.Lines.Add(FloattoStr(Trunc(X*Y)));
この結果は、149999999999999 となるでござる。
つまり、レジスタ上でTrunc(切り捨て)まで一気にやってしまうと、
99999……の無限小数が切捨御免になるのでござろう。
一度、Z := X*Y; と変数に代入してから Trunc(Z)とすれば問題ないでござる。
切捨御免さんありがとうございました。
解決しました。
解決時チェック忘れてました・・・
ツイート | ![]() |