実数型に変換後Truncを使う

解決


仕事初め  2004-01-10 02:42:12  No: 6648

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でした。
他の手段はありませんでしょうか?


ウォレス  2004-01-10 03:01:25  No: 6649

解決方法ではないですが。
実験結果を・・・

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  と表示されます。
面白いですね〜


にしの  2004-01-10 04:09:46  No: 6650

うちでも最初は14 15 15と出ていたんですが、今は15 15 15と出ています。
もちろんコピー&ペーストで、memo1の部分をShowMessageに変更。これは最初の結果表示も同じように変更していました。
最初の結果が出たときから、プロジェクトオプションなどは変更なし。
# デバッグ用になっているので、「最適化」のチェックがはずれていたり、デバッグ情報が付加されていたりしますが。
桁落ちにしても、ちょっと不思議な気もします。

Delphi7Pro+WinXPPro


切捨御免  2004-01-10 05:27:10  No: 6651

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)とすれば問題ないでござる。


仕事初め  2004-01-22 04:23:00  No: 6652

切捨御免さんありがとうございました。
解決しました。


仕事初め  2004-01-22 04:23:49  No: 6653

解決時チェック忘れてました・・・


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加