在小数点后显示有限的位数

时间:2013-02-06 15:44:03

标签: c++

考虑以下代码:

#include <iostream>
using namespace std;

int main ()
{
  int a;
  double b;
  cout << "Enter a number to be divided by three" << endl;
  cin >> a;
  b = a / 3.0;
  cout << "The result of this is:" << b << endl;
  return 0;
}

如何设置小数点后要存储的变量数?这包括20位以上。

4 个答案:

答案 0 :(得分:6)

您似乎认为1/3的结果答案为0.33333333333...[to infinity]

这是不正确的。浮点数的精度有限,结果值只有大约20位左右,无穷大的数字。

变量b将具有double类型的变量可以处理的所有精度。没有简单的方法来限制它。

但是,如果您只想限制显示的数量,可以限制cout显示的输出:

cout << fixed << setprecision(4) << b << endl;
  • fixed将导致输出使用固定点表示法(另一个选项为scientific)。

  • setprecision将控制要显示的最大位数。

这种情况下的输出应为:

0.333

总共4位数(小数点前1位,之后3位)。

答案 1 :(得分:1)

a/3 = b应为b = (double)a/3。它只分一次! 正如iamnotmaynard所说:你必须打印b而不是:cout << "The result of this is:"<< b << endl;

答案 2 :(得分:1)

double是固定大小的类型(大多数系统上为8个字节)。所以它只存储一定数量的数字。没有必要担心“无限分裂”(在1 / 3.0没有有限的十进制表示的意义上)。

修改(根据以下评论)

如果您实际上在寻找任意精度的实数表示,则必须使用一个库,例如Boost.Multiprecision

答案 3 :(得分:1)

在数学中,1/3具有无限的十进制表示。在计算机中,没有无限的表示。 1/3除以整数,结果是整数;由于整数不包含小数部分,因此结果为0.如果使用双精度值1.0/3.0,则会发生同样的事情:结果是适合双精度的数学结果的最佳近似值。所以不要害怕它。试试吧。