-2

考虑下面的代码:

#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

4 回答 4

6

您似乎认为将得到的答案1/30.33333333333...[to infinity]

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

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

但是,如果您只想限制显示的数量,则可以通过以下方式限制输出cout

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

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

这种情况下的输出应该是:

0.333

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

于 2013-02-06T15:46:37.110 回答
1

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

于 2013-02-06T15:46:04.583 回答
1

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

于 2013-02-06T16:00:00.113 回答
1

double是固定大小的类型(在大多数系统上为 8 个字节)。所以它只存储一定精度的数字。无需担心“无限除法”(从某种意义上说 1/3.0 没有有限的十进制表示)。

编辑(基于下面的评论)

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

于 2013-02-06T15:46:57.473 回答