Trunc()函数

Leo*_*Leo 5 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;
Run Code Online (Sandbox Code Playgroud)

Nic*_*kis 9

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

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

  D := Frac(101 / 100);
  E := Frac(101 / 100);
  ShowMessage(FloatToStrF(D, ffFixed, 15, 20));
  ShowMessage(FloatToStrF(E, ffFixed, 18, 20));
Run Code Online (Sandbox Code Playgroud)

看起来D是一样的东西0.010000000000,而E0.00999999999.

编辑: Extended类型具有比Double类型更好的精度.如果我们尝试使用FloatToString()显示D和E的值,我们可能会得到相同的结果,即使实际值不相同.


smo*_*ok1 6

请注意Nick D的回答.这样说是对的

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

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

您可以在维基百科上阅读更多内容:浮点定点

  • 并非每个浮点数都是近似值.2的负幂和它们的和(例如0.5)在没有近似的情况下表示. (2认同)