为什么Round(-0.0066219357357)返回-1?

Sar*_* S. 4 delphi

我想Round(-0.0066219357357),它给了-1.

不应该是0吗?我可以用什么来正确地围绕它?

更新: 数字是(LineDirection.X/distance)的结果; 其中LineDirection.X是一个整数,而Distace是double.

Ser*_*lyk 9

从XE查看System.pas,所有工作都由FISTP指令完成:

    procedure _ROUND;
    asm
      ...
            FISTP   qword ptr [ESP]
      ...
    end;
Run Code Online (Sandbox Code Playgroud)

根据英特尔的指令参考,根据FPU控制字的RC字段指定的舍入模式,值"舍入为整数值"

因此,我建议您检查FPU控制字的RC字段是否设置为您需要的舍入.

您可以通过使用整个控制字来执行此操作 - 请参阅Set8087CW以及相关的xxxx8087CW过程/函数,以及Default8087CW变量.

或者你可以试试Math.SetRoundMode,正如@Uwe Raabe建议的那样.您的案例听起来像是使用了rmUp或rmTruncate rmDown.

从理论上讲,你的CPU也是原因,但事实并非如此.


RBA*_*RBA 6

来自Delphi的帮助:

Round的行为可能受Set8087CW过程或Math.SetRoundMode函数的影响.

经过Delphi 2006测试,Round和Ceil给出了相同的结果:0.