Why does this double to int conversion not work?

后端 未结 3 1672
一整个雨季
一整个雨季 2020-12-16 21:28

I\'ve been thoroughly searching for a proper explanation of why this is happening, but still don\'t really understand, so I apologize if this is a repost.

#i         


        
相关标签:
3条回答
  • 2020-12-16 21:38

    4.1 cannot be exactly represented by a double, it gets approximated by something ever so slightly smaller:

    double x = 4.10;
    printf("%.16f\n", x);  // Displays 4.0999999999999996
    

    So j will be something ever so slightly smaller than 410 (i.e. 409.99...). Casting to int discards the fractional part, so you get 409.

    (If you want another number that exhibits similar behaviour, you could try 8.2, or 16.4, or 32.8... see the pattern?)

    Obligatory link: What Every Computer Scientist Should Know About Floating-Point Arithmetic.

    0 讨论(0)
  • 2020-12-16 21:40

    The fix

    int k = (int)(j+(j<0?-0.5:0.5));
    

    The logic

    You're experiencing a problem with number bases.

    Although on-screen, 4.10 is a decimal, after compilation, it gets expressed as a binary floating point number, and .10 doesn't convert exactly into binary, and you end up with 4.099999....

    Casting 409.999... to int just drops the digits. If you add 0.5 before casting to int, it effectively rounds to the nearest number, or 410 (409.49 would go to 409.99, cast to 409)

    0 讨论(0)
  • 2020-12-16 21:45

    Try this.

    #include <iostream>
    #include "math.h"
    int main()
    {
    double x = 4.10;
    double j = x * 100;
    
    int k = (int) j;
    
    std::cout << trunc(k);
    std::cout << round(k);
    }
    
    0 讨论(0)
提交回复
热议问题