【问题标题】:How to know if a double string is round-trip safe?如何知道双字符串是否是往返安全的?
【发布时间】:2025-12-18 00:25:11
【问题描述】:

我有一个双精度的文本表示,想知道将它往返双精度和返回是否安全。如果我还想接受任何类型的数字样式的输入,我怎么知道这一点?或者我如何知道使用 Double.Parse 解析双字符串时是否丢失了任何精度?或者我如何 ToString 一个 double 以匹配与另一个双字符串相同的格式?我认为任何这些问题的答案都是一个解决方案。

【问题讨论】:

  • 你已经尝试过什么?可以做一些测试吗?
  • “与另一个双字符串匹配相同的格式”是什么意思?您是否指定了这种格式? IE。我现在特此为您提供这个字符串:“123sd344+334.ere”,我声称它是一个格式良好的双精度数。你怎么猜是什么格式?
  • 嗯。我正在考虑限制有效数字和指数的数量,这样我就可以保证以 #.#E# 格式编写的任何数字都是往返安全的。

标签: c# parsing double double-precision


【解决方案1】:

使用R 格式说明符将double 转换为string

myDouble.ToString("R")

请参阅 MSDN 上的 The Round-trip ("R") Format Specifier

往返 ("R") 格式说明符保证转换为字符串的数值将被解析回相同的数值。仅 Single、Double 和 BigInteger 类型支持此格式。

(强调我的)

【讨论】:

  • 这适用于 double -> string -> double,但对 string -> double -> string 没有帮助。
  • @JohnB - 这完全取决于 double 作为字符串的原始表示。一开始就必须假设一个一致的表示。
  • “R”转换器不可靠。请参阅*.com/questions/24299692/… 了解更多信息。
【解决方案2】:

当然,这不是往返安全的,原因如下:

  1. 将字符串解析为双精度时,数字格式会丢失,因为双精度不包含有关其视觉表示的任何信息。

  2. 虽然字符串表示通常为十进制,但 double 是二进制浮点数。所以双精度中的 0.1 并不完全是 0.1,因为 0.1 的二进制表示没有有限多的数字。为了避免这个问题,您可以解析为十进制而不是双精度。

我建议构建一个存储数字和字符串表示形式的结构。

【讨论】: