Delphi 德尔福·特鲁克行为古怪

Delphi 德尔福·特鲁克行为古怪,delphi,Delphi,我有以下代码: function Extenso(nb: real); string; var total: real; begin total := Trunc(nb); ... Result := ...; end; 对于没有美分的国家,此函数返回一个完整描述数字的字符串,因此返回TRUC 当输入参数nb作为790209.00(我的错误案例,小数点为0)输入时,奇怪的是,Trunc的结果在调试器上是790208。有人能解释一下吗?!?我使用的是DelphiXE3更新2,带有

我有以下代码:

function Extenso(nb: real); string;
var
  total: real;
begin
  total := Trunc(nb);
  ...
  Result := ...;
end;
对于没有美分的国家,此函数返回一个完整描述数字的字符串,因此返回TRUC

当输入参数nb作为790209.00(我的错误案例,小数点为0)输入时,奇怪的是,Trunc的结果在调试器上是790208。有人能解释一下吗?!?我使用的是DelphiXE3更新2,带有IDE补丁包5.93和Windows10Pro 64


编辑:作为对问题的澄清,这里涉及到一条业务规则,客户将接受对结果的四舍五入,但不接受对结果的四舍五入。感谢@Dsm和@CraigYoung对您的贡献。

您需要在这里使用round而不是trunc。对于real类型,值不太精确,因此790209.00可能实际上是790208.9999999,例如,truncing这将给出所示的值。当然,如果您在5中可能有一个值,舍入可能不会给您每次想要的,并且您可能需要考虑一些函数,如

Trunc( nb + 0.000001);

值790209在
Real
的精度范围内。它被表示为一个精确的整数值。@RobKennedy:除非值790209是一个计算值(它是-参见上面的注释-33.3*23730),否则在这种情况下,该值很可能是790208.99,因为33.3在IEEE浮点类型中不能精确表示。这真是一个糟糕的建议。如果值
1.99999993562
要截断为
1
,则会返回
2
。正确的建议是指导OP理解浮点数学如何工作的概念。了解各种方法的替代方案和优缺点。建议一个懒惰的黑客只会产生一个根本上有缺陷的解决方案。@CraigYoung这取决于你试图实现的价值是什么,而这个问题并不清楚。最基本的建议是使用round,但很明显,该值不是真正的整数,必须以某种方式进行计算。但是怎么做呢?它取得了什么样的结果?1.9999999352是否可能需要向下舍入?@Dsm根据OP使用
Trunc
的事实:是的,有理由预期
1.9999999352
应该向下舍入。不,这并不“取决于你想要实现什么”。添加一个任意常量来解决对浮点数缺乏理解的问题,因为“正确的结果看起来是错误的”这就像:在所有其他任意算术的初步结果中添加
1
,因为您不喜欢以
0
结尾的数字
33.3*23730.0=79020.9
这绝对不是整数。你所要做的就是最基本的调试。为什么今天的程序员在调试技能方面如此缺乏?在很多方面,我认为这个网站是一个原因。新手开发人员在遇到问题时会在这里提问,而不是被迫学习调试和独立思考。@DavidHeffernan我理解您的沮丧,但如果您在OP的帖子上留下评论并将元讨论保留在meta上,请[友善地]。@PetterFriberg这很好。通过学习调试,提问者的境况会好得多。保持自豪感比学习调试更重要,我认为这是可能的