考虑以下代码:
#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位以上。
答案 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
,则会发生同样的事情:结果是适合双精度的数学结果的最佳近似值。所以不要害怕它。试试吧。