Convert.ToInt32行为字符串vs float / double literal

时间:2017-09-10 12:00:25

标签: c# type-conversion

传递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.

我理解stringfloat/double

正在调用Convert.ToInt32的不同重载

问题是为什么这种不一致的行为不应single重载Convert.ToInt32抛出异常而导致精度损失?

3 个答案:

答案 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会产生格式异常。

所以这是明确的设计。你应该做对。