首页 > 解决方案 > 从 .NET Framework 4.7.2 移植到 .NET5.0 后,如何避免“-0”作为 double.ToString() 结果?

问题描述

我正在将 .NET Framework 4.7.2 Visual Studio 项目移植到 .NET5.0,当值为负且接近于零时,我遇到了 double.ToString 的不同行为。

例如,转换为字符串时的双精度值 -7.1054273576010019E-15 会返回“-0”,即使我在转换之前将其舍入,而使用 .NET Framework 4.7.2 它的结果是“0”(相同的代码)。

此处讨论了这种差异https://devblogs.microsoft.com/dotnet/floating-point-parsing-and-formatting-improvements-in-net-core-3-0/但我真的不同意这是一个正如标题所说的改进,我相信 0 不应该有符号,它既不是正数也不是负数。

我知道我可以创建自定义 IFormatProvider 或扩展方法并根据需要转换双精度,但这需要更改代码中的每次转换,并且任何从事该项目的开发人员将来都需要使用它。在我看来,这个解决方案不是很直观,很可能是错误的来源。

有没有办法以更少的努力恢复以前的行为?Microsoft 是否愿意在 .NET 的未来版本中改变这一点?

编辑:我在这里的讨论中问了同样的事情https://github.com/dotnet/runtime/discussions/54537 如果它对其他人有帮助。

标签: c#.netdoubletostring.net-5

解决方案


从链接的帖子中,听起来更改是为了更符合 IEEE 754,这是所有语言都试图遵守的行为,以尽量减少混淆 - 或至少标准化特定形式的混淆。

如果这些更改变得过于向后不兼容并破坏了人们的程序,他们总是有可能恢复这些更改,但如果此时尚未完成(它已经在 .NET Core 3.1 中,这是一个 LTS 版本,并且在 .NET 5 中)我认为不会。但是在这里询问“微软是否愿意改变这一点”是错误的——在 dotnet/runtime 中提出问题并直接询问微软。

解决方法需要无处不在,但也很简单:将“-0”替换为“0”。


推荐阅读