代码之家  ›  专栏  ›  技术社区  ›  Gary McGill

为什么要加倍。ToString(“F1”)在中的行为不同。NET Core 3.1?

  •  1
  • Gary McGill  · 技术社区  · 3 年前

    我已从更新了一个项目。NET Core 2.2到。NET Core 3.1,以及我的一些单元测试现在都以一种令人惊讶的方式失败了。

    例如,我们的一个测试是检查一个数字的格式(应该四舍五入到小数点后1位)。该测试的输入值为1.65,预计结果为“1.7”。

    我将单元测试缩减为以下内容,但它失败了(实际结果为“1.6”):

    Assert.Equal("1.7", 1.65.ToString("F1"));
    

    我知道浮点处理 changed 在里面NET核心3。然而,从这些变化的描述来看,这些差异似乎只会影响小数点后第15位。

    我只能认为,也许1.65是那些很难用浮点表示的数字之一,在新世界中,它实际上被表示为1.649999999999999,这确实会导致它被四舍五入?

    注意:当我使用C#交互式控制台并输入 1.65.ToString("F1") 结果是“1.7”!

    0 回复  |  直到 3 年前
        1
  •  1
  •   Jeffrey Parks    3 年前

    有一个Github问题描述了您的确切问题,可以在这里找到: https://github.com/dotnet/runtime/issues/1640

    该问题被标记为已关闭,因为根本原因问题是数学问题。圆形的 https://github.com/dotnet/runtime/issues/1643

    所以,是的,这是一个意外的行为,是中的一个bug。NET。该漏洞具有Future的里程碑意义,这意味着它预计不会在即将发布的版本中得到修复。