2

可能重复:
C++ 双精度和四舍五入

代码:

int main(void)
{
    double a = 12;
    double b = 0.5;
    double c = 0.1;

    std::cout.precision(25);
    std::cout << a << std::endl;
    std::cout << b << std::endl;
    std::cout << c << std::endl;
    std::cout << a + b << std::endl;
    std::cout << a + c << std::endl;

    return 0;
}

输出:

12
0.5
0.1000000000000000055511151
12.5
12.09999999999999964472863

为什么 GCC 代表 0.1 和 0.5 不同?添加时,它们的表示方式不同。似乎 0.5 和整数 a 的表示方式与其他浮点数不同。或者这只是 io 库中发生的事情?是什么导致了这种行为?

4

4 回答 4

5

正如具有有限位数的十进制数只能精确表示为 10 的幂和的数字一样,二进制浮点数只能精确地表示为 2 的幂和的数字。

在这种情况下,0.1不能表示为 2 的有限幂和,而0.5and12可以(0.5等于 2 -1并且12等于 2 3 + 2 2)。

再举一个例子,0.75 也可以用二进制浮点数精确表示,因为它可以表示为 2 -1 + 2 -2

于 2012-05-25T06:56:58.337 回答
4

0.1 不能用二进制精确表示,因为它不是 2 的幂,必须用一个非常、非常、非常接近的数字来表示。这就是为什么教导学生==在比较浮点数时永远不要使用运算符,而银行应用程序几乎总是将钱存储为两个整数,即美元金额和便士数量。

于 2012-05-25T06:45:29.533 回答
4

这些问题的默认答案:

每个计算机科学家都应该知道的关于浮点运算的知识

基本上,这是浮点编码的不准确性。你有大约 17 个有效数字,做算术运算会减少它们。

于 2012-05-25T06:46:07.233 回答
0

读这个

http://floating-point-gui.de/

于 2012-05-25T06:48:36.507 回答