为什么将双精度转换为 int 似乎在第 16 位数字之后将其四舍五入?


//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

为什么会这样?

0.99999999999999999最准确的表示是1.01(
0.9999999999999999最准确的表示是0.999999999999999888977697537484

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

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

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

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

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

最新更新