c# - 从 .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 如果它对其他人有帮助。
解决方案
从链接的帖子中,听起来更改是为了更符合 IEEE 754,这是所有语言都试图遵守的行为,以尽量减少混淆 - 或至少标准化特定形式的混淆。
如果这些更改变得过于向后不兼容并破坏了人们的程序,他们总是有可能恢复这些更改,但如果此时尚未完成(它已经在 .NET Core 3.1 中,这是一个 LTS 版本,并且在 .NET 5 中)我认为不会。但是在这里询问“微软是否愿意改变这一点”是错误的——在 dotnet/runtime 中提出问题并直接询问微软。
解决方法需要无处不在,但也很简单:将“-0”替换为“0”。
推荐阅读
- python - 在语音识别中解码 utf8 错误回溯
- regex - 如何在具有特定内容的所有标签上找到匹配项?
- angular - 如何在微服务架构中获取参考数据?
- reverse-proxy - 如何使用 netflix zuul 转发到不同的路径?
- c# - 如何使用 C# 向 iOS 发送 FCM 推送通知?
- android - Firestore 持久性如何真正发挥作用?
- azure-cosmosdb - 使用 Cosmos Graph DB 在 Azure 搜索中软删除
- lua - 罗技鼠标简单代码中的 Lua 错误
- c# - 通过 chrome 扩展进行 Cookie 身份验证
- sql-server - 无法初始化 sqlcmd 库,错误号为 -2147024809