void main(int argc, char* argv[])
{
float aa=0.9;
int b=int(aa*10-10*(int)aa);
}输出b=8
然而aa*10-10*(int)aa=9.00;
为什么值会不一样呢?

解决方案 »

  1.   

    因为aa的值其实是0.899999,输出的时候会变成9,浮点数在计算机里存放会有小小误差
    int b=int(aa*10-10*(int)aa); 这句话的aa*10的结果是8.999999,10*(int)aa的结果是0,
    然后8.99999-0,再然后转换成int型,载去小数位,自然就是8了
      

  2.   

    我在BC3.1和VC6.0中都测试过,结果跟你得到的相同
    以下是VC得到的相应汇编代码,其中对程序结果产生影响的是call        __ftol (0040113c);从字面上看__ftol是浮点数转化为整形数的转换函数,但是具体转换还没有完全查清楚。
    mov         dword ptr [ebp-4],3F666666h
    fld         dword ptr [__real@4@4002a000000000000000 (0042601c)]
    fmul        dword ptr [ebp-4]
    fld         dword ptr [ebp-4]
    call        __ftol (0040113c)
    imul        eax,eax,0Ah
    mov         dword ptr [ebp-1Ch],eax
    fisub       dword ptr [ebp-1Ch]
    mov         dword ptr [ebp-18h],eax
    fld         dword ptr [__real@4@4002a000000000000000 (0042601c)]
    fmul        dword ptr [ebp-4]
    fld         dword ptr [ebp-4]
    call        __ftol (0040113c)
    mov         dword ptr [ebp-20h],eax
    fisub       dword ptr [ebp-20h]
    fstp        dword ptr [ebp-14h]
    __ftol在VC的编译器选项中有如下解释:
    Visual C++ 编译器选项   /QIfist(取消 _ftol)
    /QIfist
    当需要从浮点型转换为整型时,/QIfist 取消调用 Helper 函数 _ftol。除了从浮点型转换为整型外,_ftol 函数通过设置控制字的第 10 和第 11 位确保浮点单元 (FPU) 的舍入模式为向零方向(截断)。这保证从浮点型转换为整型时的操作正如 ANSI C 标准所描述的一样(丢弃数字的小数部分)。使用 /QIfist 时,此保证不再适用。舍入模式应是记录在 Intel 参考手册中的四种模式之一: 舍入为最接近的整数(若等距则为偶数) 
    向负无穷大方向舍入 
    向正无穷大方向舍入 
    向零方向舍入 
    可以使用 _controlfp C 运行时函数修改 FPU 的舍入行为。FPU 的默认舍入模式为“舍入为最接近的整数”。使用 /QIfist 可以改善应用程序的性能,但并不是没有风险。在生产环境中信任用 /QIfist 生成的代码前,要彻底测试对舍入模式敏感的代码部分。注意   /QIfist 在默认情况下无效,因为舍入位还影响浮点到浮点的舍入(每次计算后发生),所以当设置 C 样式(向零方向)舍入标志时,浮点计算可能不同。如果代码依赖于截断浮点数的小数部分的预期行为,则不应使用 /QIfist。如果不确定,请不要使用 /QIfist。所以可以断定_ftol是依据以上四种模式中的某一种进行转换的。
      

  3.   

    aa=0.9
    10*aa结果:9
    (int)aa结果:0楼上强,学习