c ++:奇怪的双乘法错误

xyz*_*yzt -2 c++ double

我使用VC++ 2010编译器.我的下面代码给出了509:

double volume = 5.1;
int n = static_cast<unsigned int>(volume * 100.0);
Run Code Online (Sandbox Code Playgroud)

我错过了什么吗?

谢谢

Dav*_*nan 6

浮点数据类型不能代表所有数字.由于您的计算机使用二进制浮点,因此唯一可表示的数字的形式为s2 e,其中s是有效数,e是指数.而且很容易看出5.1不适合这种模具.它不完全可以表示.

页面显示最接近的可精确表示的双精度二进制浮点值到5.1.价值是:

5.09999 99999 99999 64472 86321 19949 90706 44378 66210 9375
Run Code Online (Sandbox Code Playgroud)

因此,与5.1最接近的值略小于5.1.将它乘以100并截断,你有509.

从中了解有关该主题的更多信息的标准参考是David Goldberg的"每个计算机科学家应该知道的关于浮点算术的内容".