我正在将 .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”(例如,替换子字符串“-0”可能会导致 -0.5 的符号反转)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)