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

本文关键字:1000倍 我的 Convert ToDouble 为什么 | 更新日期: 2023-09-27 18:27:06

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

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

当我通过将值分配给双变量时

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

值变为3470.00

为什么会出现这种情况?

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

Convert.ToDouble方法默认使用您的CurrentCulture设置,如果您没有提供任何IFormatProvider

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

作为解决方案,您可以在Convert.ToDouble方法的第二个参数(如InvariantCulture)中使用已经具有.的区域性作为NumberDecimalSeparator

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

正如其他人已经提到的,问题在于区域性设置。XML应该使用不变的区域性,这就是为什么您不应该使用Convert类(尽管您可以,在每次调用中都传递CultureInfo.InvariantCulture,这很容易被忘记),而是专门为此提供的XmlConvert类,它涵盖了XML内容所需的写和读转换。

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

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