不仅在.NET中,即使在SQL Server 2005中,这种转换也会失败......
谁能告诉我为什么?。
即使在
的情况下,仅返回整数部分也不谨慎 Convert.ToInt32("10.2")
答案 0 :(得分:5)
最好失败而不是返回一些意想不到的结果。 10.0
和10.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不允许使用小数点。