为什么不打印完整的小数?

时间:2014-09-08 17:12:37

标签: c++

#include<iostream>

using namespace std;

int main (void)
{
    int test,r,i=0;
    float f;
    cin>>test;
    i++;
    while ( test!=0 )
    {
        cin>>r;
        f = 4*r*r + 0.25;
        cout<<"Case "<<i<<":"<<" "<<f<<"\n";
        i++;
        test--;
    }
    return 0;
}

我制作了这个简单的程序来计算表达式4*r*r+0.25的值。这里r将始终是1&lt; = r&lt; = 1000000之间的整数。我必须将上述表达式的值打印到两个小数位。但是,当我输入r任何&gt; = 50的值时,它仅将结果显示为output.2,例如,在将值输入为50时,它会显示结果为10000.2。为什么会这样? 我尝试使用double而不是float,但它没有帮助。

3 个答案:

答案 0 :(得分:5)

默认情况下,浮点值最多打印六位有效数字。您可以使用setprecision操纵器指定更高的精度:

#include <iomanip>

std::cout << std::setprecision(10);  // specify up to 10 significant figures

对于较大的值,您将遇到至少两个问题:

  • 计算4*r*r使用整数运算,如果整数类型不够大,则会溢出。您可能希望使用int64_t或浮点类型来支持最大为1000000的输入值。
  • float只能准确地表示最多约七位小数,因此您仍然会失去r超过几千的值的精度。 double应足以使输入值达到1000000。

答案 1 :(得分:3)

您需要设置精度,例如:

f = 4*r*r + 0.25;    
cout<<"Case "<<i<<":"<<" "<< setprecision(2) << fixed << f<<"\n";

输出:

10000.25

确保包含iomanip

答案 2 :(得分:2)

让我们看一些简化的代码:

#include <iostream>
#include <iomanip>

int main (void) {
    std::cout << 10000.25 << "\n";
    std::cout << std::setprecision(20);
    std::cout << 10000.25 << "\n";
}

输出:

10000.2
10000.25

如果你想看到这一点,我在ideone.com上添加了一个例子。