【问题标题】:c# Convert String to double loss of precisionc#将String转换为双精度损失
【发布时间】:2012-01-16 18:33:06
【问题描述】:

我有以下:

string value = "9223372036854775807";
double parsedVal = double.Parse(value, CultureInfo.InvariantCulture);

... 结果是9.2233720368547758E+18,这不是完全相同的数字。我应该如何将字符串转换为双精度而不损失精度?

【问题讨论】:

  • 试试System.Convert.ToDouble
  • 答案是:使用较短的字符串。双打没有无限的精度;您可以存储在双精度数中的最大奇数只有 16 位长。或者,也许更现实的是,转换为 ulong 而不是 double。
  • @xbonez - 有一阵子没接触过,但很确定这只是同一件事的捷径。

标签: c#


【解决方案1】:

double 只能保证 16 位(大约)十进制数字的准确性。您可以尝试切换到decimal(它还有更多的位可供使用,并且保持该值并有足够的余量)。

【讨论】:

  • 默认情况下,Double 值包含 15 位精度的十进制数字,但内部维护最多 17 位数字。
  • @Mitch 最终受到 IEEE 754 定义的限制
  • 但是为什么呢?我希望能够解析从 double.MinValue 到 double.MaxValue 的任何双精度。如果我们有 9223372036854775807 的价值,为什么我不能从字符串中得到它?如果不是指数符号也没关系。
  • @marc:既然这是双重遵守的,是的。
  • @user 是的,但它只给出了保真度该范围内;它具有 IEEE 754 定义的有限精度。它将解析为它可以表示的最接近的值。
【解决方案2】:

由于 double 的定义(二进制浮点运算的 (IEEE 754) 标准),您无法在不损失精度的情况下将 9223372036854775807 转换为 double

默认情况下,Double 值包含 15 个十进制数字的精度, 尽管内部维护了最多 17 位数字。

【讨论】:

    【解决方案3】:

    使用 Decimal 可以获得所需的精度。但请注意,Decimal 的存储范围与 double 不同。

    Can C# store more precise data than doubles?

    【讨论】:

    • 重新“存储容量” - decimal 实际上比 double更多 - 表示不同,但它是一个 96 位数字
    猜你喜欢
    • 1970-01-01
    • 2016-12-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-24
    • 1970-01-01
    • 1970-01-01
    • 2014-01-01
    相关资源
    最近更新 更多