简体   繁体   中英

C++ double to long long

If i write code in c++:

long long d = 999999998.9999999994;
cout<<d;

I get output: 999999999 (rounding up)

But output of this code:

long long d = 999999998.9999994994;
cout<<d;

is 999999998 (rounding down)

Is it something to do with precision. Is there any way i can change precision. floor() function also gives the same output.

I also noticed that if i assign value 8.9999994994 or 8.9999999994 to d (above variable). Output is 8 .

999999998.9999999994 is not exactly representable in double , so the actual value is one of the two representable numbers on either side of 999999998.9999999994 - either 999999998.99999988079071044921875 or 999999999 (assuming IEEE-754 binary64 format), selected in an implementation-defined manner. Most systems will by default round to nearest, producing 999999999 .

The net result is that on those systems when you write 999999998.9999999994 it ends up having the exact same effect as writing 999999999.0 . Hence the subsequent conversion yields 999999999 - the conversion from a floating point number to an integer always truncates, but here there is nothing to truncate.

With 999999998.9999994994 , the closest representable numbers are 999999998.999999523162841796875 and 999999998.99999940395355224609375 . Either one produces 999999998 after truncation. Similarly, with 8.9999999994 , the closest representable numbers are 8.999999999399999950355777400545775890350341796875 and 8.9999999994000017267126168007962405681610107421875 , and either one will produce 8 after truncation.

long long d = 999999998.9999999994; 

The closest value to 999999998.9999999994 that double can represent is 999999999.0 - remember that floating points have finite precision ;).
Therefore, truncating the decimal places yields 999999999 , and thats what is saved in d .

Using a literal with L -suffix does indeed lead to 999999998 being saved in d - long double has a higher precision.

long long d = 999999998.9999994994;

The closest value to 999999998.9999994994 that double can represent is actually below 999999999 - approximately 999999998.999999523 on my machine. Truncating the decimal places subsequently yields 999999998 , and that is stored in d .

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM