为什么cout截断一个双?

时间:2013-11-19 06:14:56

标签: c++ double cout

以下是我的控制台输入/输出。

  

请输入实数:-23486.33   检查的字符:9

     

谢谢。   您输入的实数是-23486.3

我输入的值是-23486.33,但是cout将其打印为-23486.3。 相关代码如下:

#include <iostream>
#include <string>
#include <cctype>

using namespace std;

//  Function prototype (declaration)
string readDouble();
bool isValidDouble(string);

int main()
{
    string value;
    double number;

    value = readDouble();
    while (!isValidDouble(value)) {
        cout << "The number you entered is not a valid integer." << endl;
        value = readDouble();
    }

    number = atof(value.c_str());
    cout << "Thank you." << endl
         << "The real number you entered is " << number << endl;
}

调试时,我会在方法调用atof(value.c_str())l;后立即检查数字的值。数字显示为-23486.33。那么在那个和cout的打印之间会发生什么?在我的代码的任何部分,我都没有设置cout的精度或使其固定。

如果您有任何疑问,请告诉我。

4 个答案:

答案 0 :(得分:2)

你试过吗

std::cout << std::setprecision(2) << number;

看看: http://www.cplusplus.com/reference/iomanip/setprecision/

答案 1 :(得分:1)

您可以将精度设置为double的最大限制。

代码段在这里:

#include <iostream>
#include <limits>
#include <iomanip>

using namespace std;
double number = ... // your double value.
cout << setprecision(numeric_limits<double>::digits10) << number << endl; 

答案 2 :(得分:1)

输出double时设置精度,并在比较时明确保持精度。

当您将DEC编号的字符串表示转换为double(浮点数表示)时,内存中的数据可能在数学上不等于字符串表示。这是浮点数表示的最佳近似值,反之亦然。

答案 3 :(得分:1)

显示

-23486.3,因为默认情况下std::cout仅打印6位数。

要打印从标准输入(转换文本→浮动数字→文本)输入的数字,您可以set_precision使用digits10作为精度:

double d = -23486.33;
int precision = std::numeric_limits<double>::digits10;
std::cout << std::setprecision(precision) << d << std::endl;

显示:

  

-23486.33


要打印完全精确的数字(通常用于转换浮动数字→文本→浮动数字),您可以set_precision使用max_digits10作为精度:

double d = -23486.33;
int precision = std::numeric_limits<double>::max_digits10;
std::cout << std::setprecision(precision) << d << std::endl;

显示:

  

-23486.330000000002

此处打印的数字不相同,因为-23486.33在IEEE编码中没有精确的表示形式(用基数2表示而不是基数10)。


有关digits10max_digits10的详细信息,请参阅: