Delphi SetRoundMode(rmUp)和RoundTo(4.1,0)-意外结果

Delphi SetRoundMode(rmUp)和RoundTo(4.1,0)-意外结果,delphi,delphi-10.2-tokyo,Delphi,Delphi 10.2 Tokyo,还有一个关于舍入的问题——我知道:) 我无法理解为什么会发生以下情况: SetRoundMode(rmUp); try Result := RoundTo(4.1, 0); //Result = 4??? finally SetRoundMode(rmNearest); end; 我希望对于任何大于4的输入,结果都是5,特别指定了RoundMode为rmUp 如果我检查RoundTo的代码,出于某种原因,它会绕过当前的FPU设置(Syst

还有一个关于舍入的问题——我知道:)

我无法理解为什么会发生以下情况:

    SetRoundMode(rmUp);
    try
      Result := RoundTo(4.1, 0); //Result = 4???
    finally
      SetRoundMode(rmNearest);
    end;
我希望对于任何大于4的输入,结果都是5,特别指定了RoundMode为rmUp

如果我检查RoundTo的代码,出于某种原因,它会绕过当前的FPU设置(System.Math.pas,ln 1025):

如果我对此进行评论,它将按预期工作。 为什么要这样做?我可以安全地使用我的“更正”版本吗?(当然,我可以很容易地编写一个函数来实现我想要的,但鉴于我已经使用了数学,我不喜欢无缘无故地重新发明轮子。)


文档也很混乱。它提到SimpleRoundTo受FPU的影响,但不受RoundTo的影响。两者都不是…

这确实令人困惑

如果目标只是将十进制值四舍五入到最接近的整数,则可以使用更明确、更可预测的
Ceil
方法()。

始终使用“银行家四舍五入”规则,因此您看到的是预期行为。需要使用
round()
。请参阅使用该选项的帮助示例。
@@ValidRange:
  fnstcw  word ptr [esp]   { save }
  word ptr [esp+2] { scratch }
  and     word ptr [esp+2], $f0ff { clean RC/PC bits. }
  or      word ptr [esp+2], $0300 { round to nearest even / full precision }
  fldcw   word ptr [esp+2]