C++数值类型转换方法,第1张

C++数值类型转换方法,第2张

用C语言编程时,有时需要将一种数值(如float类型数值)转换成另一种类型(如int类型数值)。这时候就需要使用类型转换运算符,比如(int)、(float)等等。但是在VC++中,当float类型的值转换为int类型时,有时会出现很大的误差。我在工作过程中遇到过,当时我用下面的方法将一个值为1140.00的浮点变量ftemp转换成int类型,itemp =(int)ft EMP;此时int变量itemp的值为1139,错误为1(在本文中,我把这个错误称为“1错误”)。这么大的误差是我们不能接受的。

经过深入的测试和研究,我发现:在VC++中,当一个float变量被初始化时(从屏幕输入一个值或者给它赋一个常数值),通过上面的方法转换成int类型。结果去掉小数部分,保留整数部分,误差小于1,所以不存在“1误差”;但当一个float变量被初始化,然后经过一些运算转换成int时,可能会出现“1错误”,即结果不仅去掉了小数部分,还改变了整数部分。比如我们把以米为单位的数据转换成以厘米为单位的数据,用浮点变量F存储以米为单位的数据,用int变量I存储以厘米为单位的数据,用下面的语句实现数据转换。

I =(int)(f * 100);当f=11.40(米)时,i=1139(厘米);当f=11.41(米)时,i=1140(厘米);当f=12.32(米)时,i=1231(厘米);当f=12.33(米)时,i=1232(厘米);等等,很多数据的转换存在“1错误”。但大部分数据转换是无误差的,比如当f=11.39 (m),I = 1139(cm);当f=12.31(米)时,i=1231(厘米)。如果用下面的方法实现数据转换,“1错误”也会存在。浮点ftempftemp = f * 100I =(int)ft EMP;这里,ftemp是一个局部变量(定义在函数内部)或一个全局变量(定义在函数外部)。把f*100改成f*100.0,“1误差”也存在。但是,如果将ftemp更改为类的属性变量(在类中定义),则“1 error”不存在。

我还发现“1误差”的现象对于正数和负数都具有对称性。即如果有“1误差”,对于正数,转换后(int)减1;对于负数,(int)转换为1 more。上例中,当f=-11.40 (m)时,I =-1139(cm);当f=-11.41(米)时,i=-1140(厘米);当f=-12.32(米)时,i=-1231(厘米);当f=-12.33(米)时,i=-1232(厘米)。而且,转换误差不会大于1。

针对以上分析结果,我在这里给出一个纠正“1错误”的方法,供参考。我设计了一个函数来将float类型的数字转换成int类型的数字,而不是(int)操作符。功能列表如下:

int float _ to _ int(float f){ int I;浮动ferrorI =(int)f;ferror = f-(float)I;If(fabs(ferror)在此函数中,通过判断(int)类型转换前后的误差ferror是否大于0.99来判断是否存在“1误差”。如果有,会改正。修正方法是正数的(int)转换结果加1;对于负数,从(int)转换结果中减去1。

定义了float_to_int()函数后,可以通过用它替换(int)运算符来纠正“1错误”。上面这个把米为单位的数据转换成厘米为单位的数据的例子,改成I = float _ to _ int(f * 100);或者float ftempftemp = f * 100I = float _ to _ int(ft EMP);当f=11.40(米)时,i=1140(厘米);当f=11.41(米)时,i=1141(厘米);当f=12.32(米)时,i=1232(厘米);当f=12.33(米)时,i=1233(厘米);当f=-11.40(米)时,i=-1140(厘米);当f=-11.41(米)时,i=-1141(厘米);当f=-12.32(米)时,i=-1232(厘米);当f=-12.33(米)时,i=-1233(厘米)。“1错误”消失了。而且在没有“1误差”的情况下对原始数据没有影响,比如当f=11.39 (m),i=1139 (cm)。通过大量数据的检验,证明了该方法的有效性。

此外,double类型转换为int类型也存在类似的“1错误”问题,只不过有错误的数据很少,也存在偶然性(即对于某个值,有时有“1错误”,有时没有“1错误”)。类似的方法也可以用来纠正从double类型到int类型的“1错误”。

位律师回复
DABAN RP主题是一个优秀的主题,极致后台体验,无插件,集成会员系统
白度搜_经验知识百科全书 » C++数值类型转换方法

0条评论

发表评论

提供最优质的资源集合

立即查看 了解详情