为什么Convert.ToInt32(“10.0”)失败

时间:2010-12-22 08:50:00

标签: .net sql-server-2005

不仅在.NET中,即使在SQL Server 2005中,这种转换也会失败......

谁能告诉我为什么?。

即使在

的情况下,仅返回整数部分也不谨慎
    Convert.ToInt32("10.2")

4 个答案:

答案 0 :(得分:5)

最好失败而不是返回一些意想不到的结果。 10.010.2不是整数。如果您知道要处理浮点数,请使用相应的数据类型:

float result = Convert.ToSingle("10.2", CultureInfo.InvariantCulture);

在处理浮点数时也不要忘记考虑文化,因为小数点分隔符可能不总是.

答案 1 :(得分:5)

其他人已经解释了为什么解析“10.2”为10会是一个坏主意。现在让我们考虑“10.0”。

“10.0”是一个数字的字符串表示,可以具有小数部分 - 换句话说,不是整数。

如果要将值解析为整数,则应该解析整数表示。 “10.0”几乎肯定只是巧合一个整数...数据源显然不是整数的来源,所以你不应该将它们视为整数。

如果你想要一个“真实”数字的最接近的整数,你应该将它解析为一个实数,然后按你想要的方式进行舍入。

以这种方式思考:选择正确的解析形式表达了对输入格式的信念。目前的行为告诉你,你猜得不好。

答案 2 :(得分:2)

因为10.2不是一个整数,所以程序员会更明确地说明精度的损失。

如果这样做而不能抛出,很可能会因错误的类型分配/转换而导致意外丢失精度错误。

答案 3 :(得分:2)

Convert.ToInt32(" 10.0")只是调用Int32.Parse(" 10.0") 其中,等于Number.ParseInt32(" 10.0",NumberStyles.Integer,NumberFormatInfo.GetInstance(provider));

这里最有趣的部分是NumberStyles.Integer值。这是一种复合数字样式,包括AllowLeadingWhite,AllowTrailingWhite和AllowLeadingSign样式。请注意,AllowDecimalPoint不包含在NumberStyles.Integer值中。所以,如果string包含小数点,我们就有格式异常。因为解析Int32不允许使用小数点。