float value = 1.9F;
value *= 10;
int temp = (int)(value + 700);double value = 1.9F;
int temp = (int)(value * 10 + 700);请高手指教一下,上面两段代码,temp的结果为什么不一样,前者为719,后者为718
value *= 10;
int temp = (int)(value + 700);double value = 1.9F;
int temp = (int)(value * 10 + 700);请高手指教一下,上面两段代码,temp的结果为什么不一样,前者为719,后者为718
当声明double value = 1.9F;时候,其实value的值是1.89999999...这个通过调试可以看到
知道这个下面就好理解了value * 10 自动转换为int型得18
float 是单精度的
double是双精度的
你断点一下就知道了
二者的指数位都是 ×16,所以 float结果反而达到了19
value *= 10;//此时value 为19
int temp = (int)(value + 700);double value = 1.9F;//value为1.9f
int temp = (int)(value * 10 + 700);//乘10后为18.99999..
精度丢失
00000041 fld dword ptr [ebp-40h] ; 将1.9F装入浮点寄存器ST0
00000044 fmul dword ptr ds:[0050156Ch] ; 将浮点寄存器ST0里面的乘以10保存到ST0里面
0000004a sub esp,8 ; 调整栈指针
0000004d fstp qword ptr [esp] ; 将ST0里面的值放到栈顶作为调用716E133C的参数
00000050 call 716E133C ; 调用转换函数
============================================================================
0000003a mov dword ptr [ebp-40h],3FF33333h ; 将1.9F保存在栈上的局部变量里面
00000041 fld dword ptr ds:[00571570h] ; 将1.9F装入浮点寄存器ST0
00000047 fmul dword ptr [ebp-40h] ; ST0*ebp-40h保存到ST0里面
0000004a fstp dword ptr [ebp-40h] ; 将ST0的值保存在ebp-40的位置
0000004d fld dword ptr [ebp-40h] ; 将这个ebp-40h上的浮点取出来放到ST0里面00000050 sub esp,8 ; 调整栈指针
00000053 fstp qword ptr [esp] ; 将ST0里面的值放到栈顶作为调用7167133C的参数
00000056 call 7167133C ; 调用转换函数可以看出问题就在红色的这两句(貌似和IL是一致的),实际上float在浮点寄存器的里面的值是: +1.8999999761581420e+0001,但是当保存到栈上再取出来以后就变成了+1.9000000000000000e+0001,这里存在一个“隐式转换”。显然正确的结果应该是19而不是18,通过上面的分析,程序稍加修改便可以得到正确的输出结果:
int temp = (int)((float)(value2 * 10 + 700));
再转整形之前将求值内容转换成float即可。
个人意见,仅供参考。
int temp2 = (int)(value2 * 10 + 700);