【问题标题】:.NET Core 3 returns -0 string when a near 0 negative number is rounded当舍入接近 0 的负数时,.NET Core 3 返回 -0 字符串
【发布时间】:2020-07-07 13:51:20
【问题描述】:

所以这个奇怪的行为是在我们正在实施的单元测试中发现的。

在 .NET Core 3.x 中,如果将接近 0 的负数四舍五入然后转换为字符串,则字符串将显示“-0”而不是 0。

Framework 和 .NET Core 2.x 不会出现这种行为。

double d = -.1;
Console.WriteLine(Math.Round(d,0));

.NET Core Fiddle

Framework Fiddle

这是 Core 中的新错误,还是一些奇怪的预期更改?

【问题讨论】:

标签: c# .net .net-core


【解决方案1】:

这是 .NET Core 3.0 中的一项重大更改,以实现语言之间的一致性和 IEEE-754 合规性。

引用Floating-Point Parsing and Formatting improvements in .NET Core 3.0:

ToString()、ToString("G") 和 ToString("R") 现在将返回最短的可往返字符串。

上面的重点是“roundtrippable”。在此更改之前,负零“-0”无法正确往返,通过Fixing up the Double/Single parsing code to be correct #20707Roundtrip string format for single/double doesn't roundtrip -0 #9883的组合修复。

【讨论】:

  • 但逻辑上是-0和0,都是一样的
  • @viveknuna 从某种意义上说,是的,但在浮点数学中 1 / 0.0 = ∞1 / -0.0 = -∞。这实际上是最后一个链接中给出的示例。有关更多信息,请参阅 signed zeroIEEE-754
  • 伟大的以前不知道这个
  • 有件事告诉我这会吸引很多人。考虑到 .NET 现在已经存在了多长时间,如果没有简单的方法来覆盖,我觉得这种改变很糟糕。这将使移植现有代码成为一场噩梦,因为应用程序用户现在可能会面临到处都是 -0。
  • @Tronald 没错,而且它可能会让其他会抱怨旧行为的人感到高兴。这是不可避免的破坏性变化。至于影响有多大,我不知道也猜不到。您的问题似乎是关于 SO 的第一个问题,如果有任何迹象的话,并且距离 Core 3 预览已经一年多了..
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-09-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多