C ++中的双精度

时间:2017-09-16 22:00:51

标签: c++ double precision

我知道之前已经问过这个问题但是在一堆我不能理解的不同情境中(因为我是c ++语言的新手,以前来自java)。我的问题与std::fixed中的setprecision()iomanip有关。

我有以下简单的双:

double price = 7.50001;

有了这个,我希望它按照正常价格输出:

cout<< "The price is:$" <<fixed<<setprecision(2)<< price <<endl;

但是现在由于std::fixedcout我从现在开始使用的precision(2)6.5100000。我的问题是如何回滚到先前的精度,即如果我添加另一个双精度6.5,则输出将为6.2000006.2之类的双精度将为6.15555 },6.15555将为std::streamsize ss = std::cout.precision(); 等(按照之前的规定)。

注意我已尝试按照google使用此功能:

6.50

...然后使用ss重置精度,但是这不起作用,因为输出仍然包含之前没有的尾随零。例如6.50在输出6.5之前输出def main(): print('Period of a pendulum') Earth_gravity = 9.8 Mars_gravity = 3.7263 Jupiter_gravity = 23.12 print(' ') pen = float(input('How long is the pendulum (m)? ')) if pen < 0: print('illegal length, length set to 1') else: print(' ') main() (之前的任何双数都是如此,它会消除尾随零)。

3 个答案:

答案 0 :(得分:2)

根据我的理解,你想要用不同的格式打印双打,这对于cout会做几次,但是使用不同的精度说明符:

    std::streamsize defaultprecision = std::cout.precision(); // save default precision    
    std::cout.precision(1); // change default precision
    cout << std::fixed; // enable fixed
    double price = 6.5100000;
    cout<< "The price is:$" << price <<endl;
    price = 6.200000;
    cout<< "The price is:$" << price <<endl;

    std::cout.unsetf ( std::ios::fixed );  // disable fixed     
    std::cout.precision(defaultprecision); // restore default presicion

    price = 6.15555;
    cout<< "The price is:$" <<price <<endl;

输出:

6.5
6.2
6.15555

答案 1 :(得分:1)

我认为,最方便的是简单地保存所有格式标志并重置它们。

double price = 6.511111;

std::ios  state(NULL);
state.copyfmt(std::cout);
std::cout << "The price is:$" << std::fixed << std::setprecision(2)<< price << std::endl;
std::cout.copyfmt(state);
std::cout << "The price is:$" << price << std::endl;

输出:

The price is:$6.51
The price is:$6.51111

编辑:如果您经常需要它,可能是为此创建类并处理重构析构函数中的标志的选项,但对于您的简单示例,它似乎有点超过顶部。

答案 2 :(得分:0)

您可以自己定义重置机制:

#include <iostream>
#include <iomanip>

namespace format
{
    class reset_type
    {
        std::ios state;
    public:
        reset_type() : state(nullptr) { state.copyfmt(std::cout); }
        friend std::ostream& operator<<(std::ostream& os, reset_type& r)
        {
            os.copyfmt(r.state);
            return os;
        }
    } reset;
}

int main()
{
    const double price = 6.511111;
    std::cout << "The price is: $" << std::fixed << std::setprecision(2) << price << "\n"
              << format::reset << "The price is: $" << price << "\n";
}

Demo

<强>输出

The price is: $6.51
The price is: $6.51111