铸造会奇怪地改变值

Casting changes value strangely

本文关键字:改变      更新时间:2023-10-16

为什么在这个(可怕的(C++代码片段中a1=72而不是73

#include <iostream>
#include <string>
using namespace std;
int main (int argc, char* argv[])
{   
    double       a  = 136.73;
    unsigned int a1 = (100*(a-(int)a));
    cout << (a-(int)a)     << endl; // 0.73
    cout << 100*(a-(int)a) << endl; // 73
    cout << a1             << endl; // 72 !
}

您可以在 http://codepad.org/HhGwTFhw 执行它

如果提高输出精度,您将看到(a - (int) a)打印0.7299999999999898

因此,此值的截断(当您将其转换为int时获得(确实72

(此处更新了代码板。

这是一个常见的精度问题。文字136.73实际上代表数字

136.729999999999989768184605054557323455810546875

a-(int)a的结果不是0.73(即使这是显示的内容(,而是

0.729999999999989768184605054557323455810546875

当你把它乘以100,你得到

72.9999999999989768184605054557323455810546875

而且由于从双精度转换为 int 会切断小数点后的所有内容,因此您可以得到72.

0.73不能精确表示,因此它四舍五入到接近它的数字,在本例中小于 0.73 . 当乘以 100 时,你会得到 72.[something] ,后来修剪为 72

更多信息

如果您阅读以下文章,可能会变得清晰:每个计算机科学家都应该知道的关于浮点运算的知识。

其他人已经表明,(a - (int)a)的结果并不完全是 0.73,而是略低。文章解释了为什么会这样。这不是一个容易阅读的东西,但确实是每个使用 FP 的人都应该阅读并尝试理解的东西,IMO。