Convert.ToInt32
vs string
字面后, float/double
的行为会有所不同
var result = Convert.ToInt32(12.4);//returns 12
result = Convert.ToInt32(12.44);//returns 12
result = Convert.ToInt32(12.4444444);//returns 12
result = Convert.ToInt32("12.4"); // Input string was not in a correct format.
正在调用Convert.ToInt32
的不同重载
问题是为什么这种不一致的行为不应single
重载Convert.ToInt32
抛出异常而导致精度损失?
答案 0 :(得分:1)
我看到它的方式,当您从float
/ double
开始并转换为int
时,您会发现精度不足。当你有一个转换为int的字符串时,你不希望解析会丢失任何数据,你只是希望它解析并在字符串无效时失败。
答案 1 :(得分:1)
问题是为什么这种不一致的行为不应该单一 Convert.ToInt32的重载会导致精度损失的异常 ?
您可以考虑当前用于将double
转换为int
的实用程序方法" cast" ie {{ 1}},(int)12.4
等等,这实际上意味着你肯定知道你很有可能会丢失数据精度,因此简而言之就像告诉编译器" go提前转换它,因为我不介意数据丢失" ,因此,不会抛出任何异常,而最后一个从(int)12.44
转换为string
的示例应该抛出异常,因为根据MSDN:
ToInt32(String)方法相当于将值传递给 Int32.Parse(字符串)。
并且众所周知int
如果指定的字符串格式不正确则抛出异常。
答案 2 :(得分:0)
首先必须将字符串转换为double,然后将其转换为int。或者做另一个转换为int。
result = Convert.ToInt32(Convert.ToDouble("12.4"));
来自msdn Convert.ToInt32(string)
将数字的指定字符串表示形式转换为等效的32位有符号整数。
https://msdn.microsoft.com/en-us/library/sf1aw27b(v=vs.110).aspx
在给定的示例中,您可以看到从double表示转换为int会产生格式异常。
所以这是明确的设计。你应该做对。