根据平台,C#舍入不同?

bey*_*ond 17 c# rounding

我有这么小的代码

double s = -2.6114289999999998;
double s7 = Math.Round(s, 7);
double s5 = Math.Round(s, 5);
double s6 = Math.Round(s, 6);
Run Code Online (Sandbox Code Playgroud)

有了Platform = Any CPU,我明白了

s7: -2.611429   
s5: -2.61143    
s6: -2.611429   
Run Code Online (Sandbox Code Playgroud)

使用Platform = x64,我得到了

s7: -2.6114289999999998 
s5: -2.61143    
s6: -2.6114289999999998
Run Code Online (Sandbox Code Playgroud)

为什么?(从VS的Locals窗口复制的输出)


整段代码是:

    private void btnAlign_Click(object sender, EventArgs e)
    {
        double s = -2.6114289999999998;
        double s7 = Math.Round(s, 7);
        double s5 = Math.Round(s, 5);
        double s6 = Math.Round(s, 6);
    }
Run Code Online (Sandbox Code Playgroud)

l33*_*33t 4

该值-2.611429无法使用 64 位浮点表示。在 32 位模式下编译时,该值将改为使用 80 位(扩展精度)。

  • 具体来说,在 x64 上使用 SSE2 FPU,在 x86 上使用 x87 FPU。 (4认同)
  • 无论精度如何,“-2.611429”都无法用二进制浮点*句点*精确表示。结果是一个连分数,没有有限数量的位可以表示。精度的差异只会在舍入(和解析字符串)时导致不同的结果,但 80 位精度在某种程度上就足够了,这是不正确的(从这个答案可以推断出)。 (3认同)