查看以下代码,为什么Trunc函数的结果不同?
procedure TForm1.Button1Click(Sender: TObject);
var
D: Double;
E: Extended;
I: Int64;
begin
D := Frac(101 / 100) * 100;
E := Frac(101 / 100) * 100;
I := Trunc(D);
ShowMessage('Trunc(Double): ' + IntToStr(I)); // Trunc(Double): 1
I := Trunc(E);
ShowMessage('Trunc(Extended): ' + IntToStr(I)); // Trunc(Extended): 0
end;
答案 0 :(得分:9)
格式化功能并不总是显示实际数字(数据) 实数和精度可能很棘手。
查看此代码,我在屏幕上看到的内容更精确:
D := Frac(101 / 100);
E := Frac(101 / 100);
ShowMessage(FloatToStrF(D, ffFixed, 15, 20));
ShowMessage(FloatToStrF(E, ffFixed, 18, 20));
似乎D
类似于0.010000000000
而E
类似于0.00999999999
。
修改: Extended
类型的精度高于Double
类型。
如果我们尝试用FloatToString()显示D和E的值,我们可能得到相同的结果,即使实际值不相同。
答案 1 :(得分:6)
注意尼克D的回答。他说那是对的
似乎D就像是 0.010000000000而E类似于0.00999999999。
然而,答案不在于格式化功能。这就是浮点计算的完成方式。计算机根本不理解浮点数(因为在0和1之间存在无限数量的数字,而计算机在有限数量的位和字节上运行),并且Delphi(和大多数其他语言)中的每个Double或Extended变量只是一个近似值(有一些非常罕见的例外)。
您可以在维基百科上阅读更多内容:Floating point和Fixed-point