ios_base :: исправлены и усечены конечные нули - PullRequest
0 голосов
/ 18 января 2019

При печати определенных десятичных чисел может произойти округление (моей нынешней платформой является IBM iSeries).Если я устанавливаю ios_base :: fixed, он работает лучше, но печатает раздражающие конечные (и незначительные) нули.У кого-нибудь есть способ получше?Для платформы, которую я использую, вывод такой:

myval=100000
myval=99999.990000
myval as string =99999.990000
#include <iostream>
#include <string>
#include <sstream>
#include <iomanip>
#include <unistd.h>
#include <algorithm>

using namespace std;

// returns t
template<typename T> string toString(const T& val)
{
    stringstream os;

    os.setf(std::ios_base::fixed);
    os << val;
    return os.str();
}

class MyApp {
private :
public :
    MyApp();
    virtual ~MyApp();

    void run();

    operator bool() const { return true; }
};


MyApp::MyApp()
{
}

MyApp::~MyApp()
{
}

void MyApp::run()
{
    double myval = 99999.99;
    string myval_as_string = toString<double>(myval);

    cout << "myval=" << myval << endl;

    cout.setf(std::ios_base::fixed);

    cout << "myval=" << myval << endl;
    cout << "myval as string =" << myval_as_string << endl;
}

int main(int argc, char* argv[])
{
    MyApp myApp;

    myApp.run();
}

1 Ответ

0 голосов
/ 18 января 2019

Вы ищете precision, а не fixed. precision будет указывать максимальную используемую точность, но не будет автоматически печатать больше нулей, поэтому увеличивайте ее столько, сколько вам нужно. fixed принудительно выставит столько нулей, сколько установлено для precision. Если вы установили fixed ранее, вы можете сбросить его с помощью ios_base::defaultfloat.

template<typename T> string toString(const T& val)
{
    stringstream os;

    os.precision(15);
    os << val;
    return os.str();
}
....
void MyApp::run()
{
    double myval = 99999.99;
    string myval_as_string = toString<double>(myval);

    cout << "myval=" << myval << endl;
    cout.precision(15);
    cout << "myval=" << myval << endl;
    cout << "myval as string =" << myval_as_string << endl;
}

Для получения дополнительной информации, вы можете проверить стандарт здесь: http://www.cplusplus.com/reference/ios/ios_base/precision/. Обратите внимание на следующую строку:

Используя стандартную запись с плавающей точкой, поле точности определяет максимальное количество значащих цифр для отображения в общем считая как до, так и после десятичной точки. уведомление что это не минимум, и поэтому он не дополняет отображаемый число с конечными нулями, если число может отображаться с меньшим цифр, чем точность.

...