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]