You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Delphi11为何无法精确计算浮点数值?

浮点数精度导致的计算误差问题

问题代码

var
  saldo: real;
  a,b,c: real;
begin
  a:= 2580;
  b:= 188.9;
  c:= 2768.9;
  saldo:= a+ b- c;  
  showmessage(floattostr(saldo)); // -8,5265128291212e-14
end;

原因分析

  • Delphi中的real类型对应IEEE 754双精度浮点数(double),这类浮点数无法精确存储所有十进制小数。像188.9和2768.9这样的小数,在二进制中是无限循环的近似值,并非精确值。
  • 计算a + b时得到的是2580 + 188.9的近似结果,再减去2768.9的近似值,两个近似值的微小误差会累积,最终得到一个极其接近0但不等于0的极小数值,也就是你看到的-8,5265128291212e-14。
  • 这是浮点数的固有特性,并非Delphi的bug,所有基于IEEE 754标准的编程语言都会出现这类现象。

解决建议

  • 如果需要精确的十进制小数计算,可以使用Delphi的Currency类型(定点数,精确到小数点后4位)。
  • 若仍需使用浮点数,在判断结果是否为0时,不要直接判断等于0,而是设置一个极小的误差阈值,比如:
    if Abs(saldo) < 1e-10 then
      ShowMessage('结果为0')
    else
      ShowMessage(FloatToStr(saldo));
    

内容的提问来源于stack exchange,提问作者OSCAR DAMM ZAMBRANA

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 07:02:35