C# 为什么Convert.ToDouble会将我的值更改因子1000?

C# 为什么Convert.ToDouble会将我的值更改因子1000?,c#,double,type-conversion,C#,Double,Type Conversion,我正在从XML文件中读取一些x和y坐标 坐标如下所示3.47,-1.54。。等等 当我通过 double x, y; x = Convert.ToDouble(reader["X"]); // X Value: 3.47 该值变为3470.00 为什么会出现这种情况?Convert.ToDouble方法在默认情况下使用您的设置,如果您不提供任何IFormatProvider 看起来您的CurrentCulture没有将用作,但它可能将用作。这就是为什么字符串被解析为3400而不是3.4 作为一

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

坐标如下所示
3.47
-1.54
。。等等

当我通过

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


为什么会出现这种情况?

Convert.ToDouble
方法在默认情况下使用您的设置,如果您不提供任何
IFormatProvider

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

作为一种解决方案,您可以在
Convert.ToDouble
方法的第二个参数中使用已具有
的区域性作为
numberdCimalSeparator

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

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

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

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

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

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

错误的文化设置?尝试
Convert.ToDouble(读卡器[“x”],CultureInfo.InvariantCulture)
x = XmlConvert.ToDouble(reader["X"]);