C#:ConverttoInt——(int)/Int32.Parse/Convert.ToInt32区别

问题:

在将小数、字符串转换成整数(int)类型时,会有取整,四舍五入等多种需求;转换方式也有显式转换、函数转换等多种方式。

1.显式转换(int)

示例:

double value = 1.72;

int n = (int)value; //n=1;

double value =1.32;

int n = (int)value; //n=1;

作用:

将 double 或 float 值转换为整型时,值会被截断(取整)。

如果该结果整数值超出了目标值的范围,其结果将取决于溢出检查上下文。

不足:

无法直接对String类型进行显式转换。

问题:

可能是因为计算精度问题,下面表达式并不是截断取值。

double value =1.9999999999999999;

int n = (int)value; //n=2;

2. Int32.Parse

String 类型不可以通过显示转换来完成。那么如何将String类型转换成int?

示例:

int number =Int32.Parse("179");//179

int number =Int32.Parse(" -204 ");//-204

作用:

可以通过 Int32.Parse 来完成转换,但必须符合以下表达式,否则将会报FormateException 错误:

[ws][sign]digits[ws]

Element

Description

ws

Optional white space.

sign

An optional sign.

digits

A sequence of digits ranging from 0 to 9.

Pasted from <http://msdn.microsoft.com/en-us/library/b3h1hf19.aspx>

可见 String 中只能包含整数。

不足:

从上面表达式中可以看出,Int32.Parse只可以将 String 转换为 int,而且 String中不可以包含小数点“.”。

int number =Int32.Parse("178.3");//FormateException.

如果需要转换带小数点“.”,可以使用 NumberStyles.AllowDecimalPoint ,但是小数点后面只可以是“0”:

Int32.Parse("179.0",NumberStyles.AllowDecimalPoint); //179

Int32.Parse("179.01",NumberStyles.AllowDecimalPoint); //OverflowException

Int32.Parse("-179.0",NumberStyles.AllowDecimalPoint); //FormateException

Pasted from <http://msdn.microsoft.com/zh-cn/library/c09yxbyt.aspx>

问题:

Int32.Parse对String 的格式有要求,如果不符合要求就会抛出异常。避免经常抛出异常,可以提前使用 Int32.TryParse来判断是否可以进行转换。

int number;
C#:ConverttoInt——(int)/Int32.Parse/Convert.ToInt32区别
bool result = Int32.TryParse("9432.0",out number);//False

Pasted from <http://msdn.microsoft.com/en-us/library/f02979c7.aspx>

3.Convert.ToInt32

(int)可以对小数进行转换,Int32.Parse 可以对 String 进行转换,两种方法各有各的优势。

有没有什么方法可以同时转换这两种类型?目前为止还没有方法可以进行四舍五入的转换,是否能够实现?

String类型转换——Convert.Int32(String)

实现:

publicstatic int ToInt32(string value)

{

if (value== null)

{

return 0;

}

returnint.Parse(value, CultureInfo.CurrentCulture);

}

作用:

从实现方法中可以看出,Convert.Int32(String) 和Int32.Parse(String) 是一样的功能。

不足:

如果需要将String中的小数转换成int,需要先将String转换成Double(Convert.ToDouble(String)),然后再转换成 int(Convert.ToInt32(Double))。

小数转换成int——Convert.Int32(Double)

示例:

Convert.ToInt32(4.5);//4

Convert.ToInt32(5.5);//6

Convert.ToInt32(-4.5);//-4

Convert.ToInt32(-5.5);//-6

Convert.ToInt32(103.919);//104

Convert.ToInt32(17834.191);//17834

Convert.ToInt32(-1023.299);//-1023

Convert.ToInt32(-103.69);//-104

实现:

publicstatic int ToInt32(double value)

{

if(value >= 0.0)

{

if(value < 2147483647.5)

{

int num =(int)value;

double num2 = value -num;

if((num2 > 0.5) || ((num2 == 0.5)&& ((num & 1) !=0)))

{

num++;

}

return num;

}

}

elseif (value >=-2147483648.5)

{

int num3= (int)value;

double num4 = value -num3;

if((num4 < -0.5) || ((num4 == -0.5)&& ((num3 & 1) !=0)))

{

num3--;

}

return num3;

}

thrownew OverflowException(Environment.GetResourceString("Overflow_Int32"));

}

作用:

从代码中可以清楚的看到,Convert.Int32(Double)并不是简单的将小数位截断,但也不是简单的四舍五入。

((num2 ==0.5) && ((num & 1)!= 0))——当小数为0.5时,如果整数位是奇数就入,如果整数位是偶数就舍。所以可以简单的归纳为:四舍六入五凑偶。

不足:

该方法未能实现四舍五入。而是根据IEEE标准实现 bankers' rounding 规则。

WIKI Link < http://en.wikipedia.org/wiki/Rounding>

总结:

将小数、字符串转换成整数(int)类型时:

如果需要将小数位都截断,可使用(int);

如果需要将整数型字符串转换成int,可使用 Int32.Parse 或者 Convert.Int32(String);

如果需要实现四舍六入五凑偶,可使用Convert.Int32(Double);

如果需要实现四舍五入,需自己写方法。

四舍五入算法参考:

//4.5 -> 5

//-4.5-> -5; 如果希望 -4.5-> -4,可自行修改。

if(value >= 0.0)

{

if(value < 2147483647.5)

{

int num =(int)value;

double num2 = value - num;

if(num2 >= 0.5)

{

num++;

}

return num;

}

}

elseif (value >=-2147483648.5)

{

int num3= (int)value;

double num4 = value - num3;

if((num4 <= -0.5))

{

num3--;

}

return num3;

}

附录显式转换列表:

From

To

sbyte

byte, ushort, uint, ulong, or char

byte

Sbyte orchar

short

sbyte, byte, ushort, uint, ulong, or char

ushort

sbyte, byte, short, or char

int

sbyte, byte, short, ushort, uint, ulong,or char

uint

sbyte, byte, short, ushort, int, or char

long

sbyte, byte, short, ushort, int, uint, ulong, or char

ulong

sbyte, byte, short, ushort, int, uint, long, or char

char

sbyte, byte, or short

float

sbyte, byte, short, ushort, int, uint, long, ulong, char,or decimal

double

sbyte, byte, short, ushort, int, uint, long, ulong, char, float,or decimal

decimal

sbyte, byte, short, ushort, int, uint, long, ulong, char, float, or double

Pasted from <http://msdn.microsoft.com/zh-cn/library/yht2cx7b.aspx>

  

爱华网本文地址 » http://www.413yy.cn/a/25101015/271303.html

更多阅读

C语言--静态变量和动态变量初始化区别 c语言局部变量初始化

补充:c里等号的意义是分两种情况,一种是在表达式里,而另一种是在变量声明中。 在变量声明中的等号不可以看作是赋值,它只是初始化,也就是说它的意义只是告诉编译器如何初始化这个内存空间。而表达式中的 =就是赋值的意思了。 自动变量和

vector 在c++中resize 和reserve的区别 resize和reserve

一、 resize和reservehttp://www.diybl.com/course/3_program/c/c_js/2007109/77298.htmlresize就是重新分配大小,reserve就是预留一定的空间。这两个接口即存在差别,也有共同点。下面就它们的细节进行分析。为实现resize的语义,resiz

声明:《C#:ConverttoInt——(int)/Int32.Parse/Convert.ToInt32区别》为网友爱闺蜜分享!如侵犯到您的合法权益请联系我们删除