Trunc()函数

时间:2009-09-09 08:25:50

标签: delphi floating-point

查看以下代码,为什么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;

2 个答案:

答案 0 :(得分:9)

格式化功能并不总是显示实际数字(数据)  实数和精度可能很棘手。

查看此代码,我在屏幕上看到的内容更精确:

  D := Frac(101 / 100);
  E := Frac(101 / 100);
  ShowMessage(FloatToStrF(D, ffFixed, 15, 20));
  ShowMessage(FloatToStrF(E, ffFixed, 18, 20));

似乎D类似于0.010000000000E类似于0.00999999999

修改: Extended类型的精度高于Double类型。 如果我们尝试用FloatToString()显示D和E的值,我们可能得到相同的结果,即使实际值不相同

答案 1 :(得分:6)

注意尼克D的回答。他说那是对的

  

似乎D就像是   0.010000000000而E类似于0.00999999999。

然而,答案不在于格式化功能。这就是浮点计算的完成方式。计算机根本不理解浮点数(因为在0和1之间存在无限数量的数字,而计算机在有限数量的位和字节上运行),并且Delphi(和大多数其他语言)中的每个Double或Extended变量只是一个近似值(有一些非常罕见的例外)。

您可以在维基百科上阅读更多内容:Floating pointFixed-point