Convert.ToInt32 行为字符串与浮点/双精度文本


Convert.ToInt32

在传递时的行为不同stringfloat/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 会产生格式异常。

所以这显然是设计使然。你应该做对。

最新更新