【问题标题】:Why does double.TryParse() return true when the precision > 16当精度 > 16 时,为什么 double.TryParse() 返回 true
【发布时间】:2017-02-27 09:25:33
【问题描述】:

通过一个小测试,我使用以下代码:

double number;
var value = "123456789.123456789";
var style = NumberStyles.AllowDecimalPoint;
var culture = CultureInfo.InvariantCulture;
if (Double.TryParse(value, style, culture, out number))
    Debug.WriteLine("Converted '{0}' to {1}.", value, number);
else
    Debug.WriteLine("Unable to convert '{0}'.", value);

结果是

将“123456789.123456789”转换为 123456789.123457。

这是因为value 太长而无法放入双精度数。只允许 16 位数字。但是由于信息丢失,TryParse() 不应该返回false 吗?

【问题讨论】:

  • 否,因为它会解析它。只是没有足够的位来存储完整的值。

标签: c# .net-4.0 double tryparse


【解决方案1】:

Msdn documentation 已经强调了这一事实

但是,由于精度损失,这些值可能不相等

它并不构成转换失败,而是发生了

如果s参数为nullString.Empty,不是格式 符合样式,表示小于MinValue 的数字或 大于MaxValue,或者如果样式不是 NumberStyles 枚举常量。

【讨论】:

    【解决方案2】:

    TryParse 返回一个布尔值。是否可以将值解析为双精度值。

    它不返回确切的值,只返回是否可以解析,作为布尔值。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-07-02
      • 2011-05-22
      • 1970-01-01
      • 2016-11-14
      • 1970-01-01
      • 2016-03-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多