【问题标题】:double.ToString truncates last 2 digits while I can still see them while debuggingdouble.ToString 截断最后 2 位数字,而我在调试时仍然可以看到它们
【发布时间】:2018-11-16 06:53:56
【问题描述】:

如何获得 double.ToString 以 不 有时会截断最后一位数字。

如果我在 Visualstudio 即时窗口或 Quickwatch 中显示双精度,我会看到 17 位小数。当我将其转换为字符串时,我看到 15.
这可能有一个很好的理由,但我的问题是如何解决它。

? 0.87912328514094507
0.87912328514094507
? 0.87912328514094507.ToString()
"0,879123285140945"

Win7 fwiw 上的 Dotnet 4.6.2。

【问题讨论】:

  • 0.87912328514094507.ToString("R") - 往返格式 - docs.microsoft.com/en-us/dotnet/standard/base-types/…
  • 请注意,从技术上讲,两种表示都在截断底层双精度。如果您的目标是获得准确的表示,您可能需要考虑使用 Jon Skeet 的 DoubleConverter 类。请参阅stackoverflow.com/a/1658420/18192 进行讨论。请注意,通常使用精确表示是不合适的,因为它显示的精度比 double 实际表示的要高。

标签: c# .net


【解决方案1】:

有两种标准机制可以实现这一目标。

如果您将"R" 作为参数传递给ToString,那么您将获得往返 字符串。也就是说,将双精度转换为字符串的字符串,然后将字符串转换回双精度始终为您提供您开始使用的双精度。

如果您将"G17" 作为参数传递,那么您将获得标准字符串格式,但扩展至小数点后 17 位。

您不知道这一点当然可以原谅!这种机制并不是特别容易发现的。我不太喜欢格式化字符串在过去 40 年中是如何演变的。

更多详情,请阅读文档:https://docs.microsoft.com/en-us/dotnet/api/system.double.tostring

【讨论】:

  • 看来"R" 并不总是适用于double。在docs 我读到“对于 Double 值,“R”格式说明符在某些情况下无法成功往返原始值。对于 Double 和 Single 值,它的性能也相对较差。相反,我们建议您对 Double 值使用“G17”格式说明符,并使用“G9”格式说明符成功往返 Single 值。”
  • 未来读者:根据我的评论@ericlippert 的评论不正确。据我了解ToString("G17") 应该是正确的答案。我应该删除标记此答案为正确的勾号吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多