首页 新闻 会员 周边 捐助

浮点数转换成Int值的问题。

0
悬赏园豆:20 [已解决问题] 解决于 2009-09-17 09:59

double a = 1.019;

int a =(int)( a * 1000);

int b = Convert.ToInt32(a*1000);

----------------------------------------------------------------

a = 1018;

b = 1019;

请问为什么会有区别。

wanghualiang的主页 wanghualiang | 初学一级 | 园豆:90
提问于:2009-09-12 22:33
< >
分享
最佳答案
0

补充下:

1 (int)是一种类型转换;当我们从int类型到long,float,double,decimal类型,可以使用隐式转换,但是当我们从long类型到int类型就需要使用显式转换,否则会产生编译错误。

 2 int.Parse()是一种内容转换;表示将数字内容的字符串转为int类型。   如果字符串为空,则抛出ArgumentNullException异常;   如果字符串内容不是数字,则抛出FormatException异常;   如果字符串内容所表示数字超出int类型可表示的范围,则抛出OverflowException异常;

 3 int.TryParse 与 int.Parse 又较为类似,但它不会产生异常,转换成功返回 true,转换失败返回 false。   最后一个参数为输出值,如果转换失败,输出值为 0

4 Convert.ToInt32()是一种内容转换;但它不限于将字符串转为int类型,还可以是其它类型的参数; 比较:   Convert.ToInt32 参数为 null 时,返回 0; int.Parse 参数为 null 时,抛出异常。    Convert.ToInt32 参数为 "" 时,抛出异常;  int.Parse 参数为 "" 时,抛出异常。   Convert.ToInt32 可以转换的类型较多; int.Parse 只能转换数字类型的字符串。


测试代码如下:

#region double
int testvar = 1000;
double a = 1.019;
int b = (int)(a * testvar);
int c = Convert.ToInt32(a * testvar);
int d = int.Parse((a * testvar).ToString());
int f = 0;//也可以不赋值,出错时为默认为0
bool result = int.TryParse((a * testvar).ToString(), out f);
Console.WriteLine(b.ToString());
Console.WriteLine(c.ToString());
Console.WriteLine(d.ToString());
Console.WriteLine(f.ToString());
Console.ReadKey();
#endregion


testvar为1000时,运行结果:

 

1018
1019
1019
1019


testvar为100时,运行结果:

int.Parse出错:输入字符串的格式不正确。

修改代码为:

 

#region double
int testvar = 100;
double a = 1.019;
int b = (int)(a * testvar);
int c = Convert.ToInt32(a * testvar);
int f = 0;//也可以不赋值,出错时为默认为0
bool result = int.TryParse((a * testvar).ToString(), out f);
Console.WriteLine(b.ToString());
Console.WriteLine(c.ToString());
Console.WriteLine(f.ToString());
Console.ReadKey();
#endregion


运行结果为:

 

101
102
0

推荐使用int.TryParse

收获园豆:15
邀月 | 高人七级 |园豆:25475 | 2009-09-13 11:03
其他回答(2)
0

前者做强制转换没有四舍五入,而后者在转换时有四舍五入的功能。

Convert.ToInt32适合将object类类型转换成int类型,(int)适合简单数据类型之间的转换。 

详细内容请参考如下链接:

http://www.cnblogs.com/flyker/archive/2009/03/04/1402673.html

http://developer.51cto.com/art/200908/142224.htm

收获园豆:5
Kinglee | 园豆:3158 (老鸟四级) | 2009-09-12 23:06
以前没注意过,不过,能说说 两者是在什么时候做的舍入吗?
支持(0) 反对(0) Mr雨 | 园豆:1199 (小虾三级) | 2009-09-14 13:48
0

以前也没注意,学习了

Jaryleely | 园豆:367 (菜鸟二级) | 2009-09-13 10:20
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册