Convert.ToInt32
在传递时的行为不同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
引发精度损失的异常?
问题是为什么这种不一致的行为不应该单一 Convert.ToInt32 的重载会引发精度损失异常 ?
您可以将当前用于从double
转换为int
的实用程序方法视为"强制转换">,即(int)12.4
,(int)12.44
等,这本质上意味着您肯定知道很有可能会丢失数据精度,因此简而言之,就像告诉编译器"继续转换它,因为我不介意数据丢失">, 因此,不会引发异常,而从string
转换为int
的最后一个示例应引发异常,因为根据 MSDN:
ToInt32(字符串) 方法等效于将值传递给 Int32.Parse(String).
众所周知Int32.Parse(String)
如果指定的字符串格式不正确,则会引发异常。
在我看来,当您从float
/double
开始并转换为int
时,您预计会损失精度。当您有一个转换为 int 的字符串时,您不希望解析造成任何数据丢失,您只希望它在字符串无效时解析并失败。
首先,您必须将字符串转换为 double,然后将其转换为 int。 或者再次转换为 int。
result = Convert.ToInt32(Convert.ToDouble("12.4"));
从 msdnConvert.ToInt32(string)
将数字的指定字符串表示形式转换为等效的 32 位有符号整数。
https://msdn.microsoft.com/en-us/library/sf1aw27b(v=vs.110).aspx
在给定的示例中,您可以看到从双精度表示转换为 int 会产生格式异常。
所以这显然是设计使然。你应该做对。