为什么将double转换为int似乎将16位数字舍入?

时间:2018-10-23 05:21:06

标签: c++ floating-point floating-accuracy

//g++  5.4.0

#include <iostream>

int main()
{
    std::cout << "Hello, world!\n";
    std::cout << (int)0.9999999999999999 << std::endl; // 16 digits after decimal
    std::cout << (int)0.99999999999999999 << std::endl; // 17 digits after decimal
}

输出:

Hello, world!
0
1

为什么会这样?

2 个答案:

答案 0 :(得分:2)

0.99999999999999999的最准确表示是1.0 1)
0.9999999999999999的最准确表示是0.999999999999999888977697537484

1)在64位双精度IEEE754浮点表示中。

由于没有舍入功能,只有截断,当转换为整数类型时,一个给出1,另一个给出0

答案 1 :(得分:1)

值0.99999999999999999(小数点后17位)的最准确浮点表示形式就是1.0。

值0.9999999999999999(小数点后16位)的最准确浮点表示形式小于1.0。

向int的转换将一个截断为0,另一个截断为1。