2013-04-02 41 views
-2

我使用VC++ 2010编译器。我下面的代码给出了509:C++:奇怪的双乘法错误

double volume = 5.1; 
int n = static_cast<unsigned int>(volume * 100.0); 

我想念什么吗?

感谢

+0

是你错过了什么... static_cast (..) – Mario

+0

这是soooooo在这里重复。在[SO]上查找IEEE754和浮点问题。基本上,5.1不能完全表示,实际上它实际上被计为'5.099999999 ' – ppeterka

+0

我认为你的代码不能编译。我建议使用'round' –

回答

6

浮点数据类型不能代表所有的数字。由于您的计算机使用二进制浮点,只表示数字的形式为S2 Ë其中小号是有效数,并ē是指数。很容易看到5.1不适合该模具。它不完全可以代表。

这个page显示你最接近的精确表示的双精度二进制浮点值到5.1。值为:

5.09999 99999 99999 64472 86321 19949 90706 44378 66210 9375 

因此,与5.1的最接近值略小于5.1。将其乘以100并截断,并且您有509.

David Goldberg的What Every Computer Scientist Should Know About Floating-Point Arithmetic的标准参考文献是David Goldberg的文章。

0

5.1表示为5.099999,与100.0相乘时为509.9990,转换为int后为509。