【问题标题】:Why does Convert.ToDouble change my Value by factor 1000?为什么 Convert.ToDouble 将我的值更改为 1000 倍?
【发布时间】:2016-03-23 19:56:33
【问题描述】:

我正在从 XML 文件中读取一些 x 和 y 坐标。

坐标看起来像这样3.47-1.54、..等等。

当我将值分配给双变量时

double x, y;
x = Convert.ToDouble(reader["X"]); // X Value: 3.47

值变为3470.00

为什么会这样?

【问题讨论】:

  • 文化设置错误?试试Convert.ToDouble(reader["x"], CultureInfo.InvariantCulture)

标签: c# double type-conversion


【解决方案1】:

Convert.ToDouble 方法使用你的CurrentCulture 设置默认如果你不提供任何IFormatProvider

看起来您的 CurrentCulture 没有将 . 用作 NumberDecimalSeparator,但它可能用作 NumberGroupSeparator。这就是为什么你的字符串被解析为3400 而不是3.4

作为一种解决方案,您可以在Convert.ToDouble 方法的第二个参数中使用已经具有. 作为NumberDecimalSeparator 的文化,例如InvariantCulture

double x;
x = Convert.ToDouble("3.47", CultureInfo.InvariantCulture); // x will be 3.47 not 3470

对于您的 -1.54 示例,您需要指定使用组合的 AllowLeadingSignAllowDecimalPoint 样式。 不幸的是Convert.ToDouble 没有以NumberStyles 作为参数的任何 重载。

为此,您可以改用double.Parse 方法。

double x;
x = double.Parse("-1.54", NumberStyles.AllowLeadingSign | NumberStyles.AllowDecimalPoint,
                 CultureInfo.InvariantCulture); // x will be -1.54

【讨论】:

    【解决方案2】:

    正如其他人已经提到的,问题在于文化设置。 XML 应该适用于不变的文化,这就是为什么你不应该使用 Convert 类(虽然你可以在每次调用中传递 CultureInfo.InvariantCulture,这很容易被遗忘),但是为此目的专门提供了一个 XmlConvert Class涵盖 XML 内容所需的写入和读取转换。

    所以在你的情况下你应该真正使用

    x = XmlConvert.ToDouble(reader["X"]);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-03-30
      • 1970-01-01
      • 1970-01-01
      • 2011-11-18
      • 1970-01-01
      • 1970-01-01
      • 2012-03-08
      • 1970-01-01
      相关资源
      最近更新 更多