日期:2014-05-18  浏览次数:21183 次

求助:float转换为int,数值发生改变;另求一个算法!
1、一个float数据转换为int类型后,数值发生了改变,如下:
float ff=1805000000;
int ii=convert.toint32(ff);

此时,ii已经不是1805000000了。看了下,1805000000这个数值还没有超出int类型的范围啊,奇怪,怎么会出现这种事情?什么原因啊?

后来想了个办法,改用decimal:
decimal ff=1805000000;
int ii=convert.toint32(ff);
测试了一下,这时数值没有发生改变,这又是为什么???不懂
在上述情况下,是不是用decimal能做到万无一失,就是对所有不超出范围的数值都能做到不改变数值的转换?

PS:把类似的float数值转化为整型时(类似这种情况),是用float保险还是decimal保险?还是double保险?还是都不保险??如果要做到保险,有没有更好的办法?------此处的保险,是指数值不发生改变??呵呵


2、大家帮忙写一个函数,我弄了半天,都不能做到完美,算法简单还是复杂,我也不知道,要求如下:

为了让用户在输入数值时有更好的体验,我想用户在textbox中输入数值时,数值实时以ddd,ddd,ddd.XXXXX的格式显示出来,
所以要在textbox的textchange事件中写入代码,但是遇到几个问题,解决起来觉得很困难:
  1)、有一个float.tostring("N")的方法可以实现上述格式的转换,但是这个是默认显示两位小数出来的,在N后面加数字,就可以改变显示小数的位数,但这样一做,就把小数位数固定“死”了,有没有灵活的方法,灵活显示小数位数,比如用户输入123.456就显示三位小数,输入123.456789就显示六位小数??
  2)、用户输入数值时,光标跳动的问题:用户输入数值,textbox上的文本会不停的改变,光标也会不停的改变位置,用户输入时,感觉相当不方便。




呵呵,谢谢大家~~~感谢


------解决方案--------------------
float 只有4字节,它只能有大约7个有效数字,所以转化为int型的时候,误差大约是1/10000000,

只要你的float大于10000000,那么它转换为整数的时候,产生的误差就会大于1,你就会看到数字变了,其实没变,只是误差,

------解决方案--------------------
decimal比较精确,据说有28~29位有效数字,也就是说,如果你的数据小于10的28次方,那么转换成整数误差不会大于1,当然int类型有效数字小于10的28次方,所以用decimal保存整数是不会有误差的,

------解决方案--------------------
double比decimal精度稍差,8个字节,14~15个有效数字,如果你的数据小于10的14次方,那么转换成整数误差不会大于1,这也超出int取值范围,所以用double也是精确的,

不过用double转换整数最好这样四舍五入:

int nData;
double dbData;

nData=(int)(dbData+0.5);//这样做可以实现四舍五入,