質問するログイン新規登録

Q&A

解決済

1回答

139閲覧

DELPHI のTrunc 関数の精度について

n.tsuchiya

総合スコア18

Delphi

DelphiはPascalを拡張してオブジェクト指向を導入したWindows, OS X,iOS,Androidのネイティブアプリケーションを開発するための言語です。旧称はObject Pascal。開発用IDE「Delphi」にあわせ現在の名前に改称されました。

0グッド

0クリップ

投稿2026/09/08 09:17

0

0

実現したいこと

Trunc関数の引数により、結果が変わってしまう。

前提

動作確認用のコードをつくりました

FormにStringGridがひとつ、Editをひとつ、Buttonを二つ貼り付けています。


procedure TForm1.Button1Click(Sender: TObject);
var
I : Integer;
D : Double;
begin
D := 0;
for I := 0 to 3 do
begin
StringGrid1.Cells[1 + I, 1] := FloatToStr(F[I]);
D := D + F[I];
end;
Edit1.Text := FloatToStr(Trunc(D/4*10));
end;

procedure TForm1.Button2Click(Sender: TObject);
var
D: Double;
begin
D:=22;
Edit1.Text := FloatToStr(Trunc(D/4*10));
end;

procedure TForm1.FormCreate(Sender: TObject);
var
I : INteger;
D : Double;
begin
F[0] := 5.3;
F[1] := 5.4;
F[2] := 5.6;
F[3] := 5.7;
end;


Truncの動作で困っています。
Button1Clickでは、Truncに渡すための引数を加算しています。

Button2Clickでは、引数に直接値を入力しています。

それぞれ引数を渡してTruncをかけると、答えが変わってしまいます。

テストコードはDelphi13で記述しました。

原因を特定したいです。
よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

guest

回答1

0

ベストアンサー

Delphiは全く知りませんが、どのプログラミング言語でも同じです。

Doubleに22を代入すると22.0です。
ところが、5.3、5.4、5.6、5.7は2進浮動小数点でちょうどの値にならないため、足しても22.0ちょうどになりません。
もっと下の桁まで表示すると、わかります。

なので、4で割って10倍して小数点以下を切り捨てると、55になるときもあれば54になるときもあります。
(処理系による)

投稿2026/09/08 10:35

hiroki-o

総合スコア1911

n.tsuchiya

2026/09/09 02:15

回答ありがとうございます。 試したところ問題が解決しました! ベストアンサーに選ばせていただきました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.25%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問