为什么 Double.ToString("F1") 在 .NET Core 3.1 中的行为不同?

Why does Double.ToString("F1") behave differently in .NET Core 3.1?

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

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

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

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

我知道 .NET Core 3 中的浮点处理是 changed。但是,从这些更改的描述来看,差异应该只影响小数点后第 15 位。

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

注意:当我使用 C# 交互式控制台并输入 1.65.ToString("F1") 时,它显示为“1.7”!

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

由于问题的根本原因是 Math.Round,该问题已标记为已关闭: https://github.com/dotnet/runtime/issues/1643

所以是的,这是意外行为,是 .NET 中的错误。该错误具有未来里程碑,这意味着它不会在即将发布的版本中得到修复。