问题:
在将小数、字符串转换成整数(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;
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>