Setprecision令人困惑

时间:2011-04-11 15:31:58

标签: c++

我只是想问一下setprecision,因为我有点困惑。

这是代码:

#include <iostream>
#include <iomanip>
using namespace std;

int main()

{
  double rate = x;
  cout << fixed << setprecision(2) << rate;
}

其中x =以下:

等式的左边是x的值。

1.105 = 1.10应为1.11

1.115 = 1.11应为1.12

1.125 = 1.12应为1.13

1.135 = 1.14这是正确的

1.145 = 1.15也正确

但如果x是:

2.115 = 2.12这是正确的

2.125 = 2.12应为2.13

那么为什么在某个值上它是正确的但有时它是错的?

请赐教。感谢

3 个答案:

答案 0 :(得分:8)

没有理由期望您的帖子中的任何常量可以使用浮点系统完全表示。因此,一旦将它们存储在double变量中,您所拥有的精确半部可能不再是精确的一半(无论iostream如何对这些数字进行舍入。)

以下代码说明了我的观点:

#include <iostream>
#include <iomanip>

using namespace std;

int main()

{
  double rate = 1.115;
  cout << fixed << setprecision(20) << rate;
}

输出:

1.11499999999999999112

我建议您查看FAQ

答案 1 :(得分:2)

您打印的某些数字可能无法表示为浮点数,实际上可能比您想象的更低或更高,直接影响舍入。

由于您尝试将浮点数格式化为固定点,您是否考虑过实际使用定义了自己的插入运算符的固定点数(int / long缩放,例如1000,具体取决于您的需要)?然后,您将始终获得准确的显示和舍入,而无需依赖setprecision具有任何特定行为(我无法快速查找标准中的相关转换部分)。

答案 2 :(得分:1)

为什么你说1.105应该是1.11? C ++标准说 没什么关系,但大多数的默认舍入模式 通常的机器(英特尔,Sparc等)是圆形的,所以1.105 应该是1.10。通常,确切的结果是准确的 在两个可表示的值之间,规则是舍入到 一个数字最低的数字。

我也想知道你在哪里获得这些价值观。平时 机器,1.105无法表示,所以你有一些东西 略大或略小。

当然,上述评论适用于所有其他评论 你引用的价值观。