为什么 Convert.ToDouble 将我的值更改为 1000 倍?

Why does Convert.ToDouble change my Value by factor 1000?

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

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

当我通过

将值赋给双变量时
double x, y;
x = Convert.ToDouble(reader["X"]); // X Value: 3.47

值变为 3470.00

为什么会这样?

Convert.ToDouble 方法使用您的 CurrentCulture 设置 默认情况下 如果您不提供 any IFormatProvider.

看起来你的 CurrentCulture 没有使用 . 作为 NumberDecimalSeparator but it probably uses as a NumberGroupSeparator。这就是为什么您的字符串被解析为 3400 而不是 3.4

作为解决方案,您可以使用 已经 具有 . 的文化作为 Convert.ToDouble 的第二个参数中的 NumberDecimalSeparatorInvariantCulture.

这样的方法
double x;
x = Convert.ToDouble("3.47", CultureInfo.InvariantCulture); // x will be 3.47 not 3470

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

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

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

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

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

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