我有一个基于istringstream的模板函数,我发现字符串值“ 99999.99”会四舍五入为100000。实际上,我发现C ++ iostream通常在进行四舍五入。普通的ole标准C printf()处理得很好。对此有什么解决办法吗?
getUserMediaSuccess
编辑-了解使用浮点/双精度的要点,但是没有人运行我发布的代码。 printf()s正确打印值(9999.9999(浮点型)除外)。我更想知道为什么stdc库与C ++的差异。
#include <iostream>
#include <string>
#include <sstream>
#include <iomanip>
#include <unistd.h>
#include <algorithm>
using namespace std;
template <class T> bool from_string(T& t, const string& s, ios_base& (*f)(ios_base&))
{
istringstream iss(s);
return !(iss >> f >> t).fail();
}
class MyApp {
private :
public :
MyApp();
virtual ~MyApp();
void run();
operator bool() const { return true; }
};
MyApp::MyApp()
{
}
MyApp::~MyApp()
{
}
void MyApp::run()
{
string elementData = "99999.99";
double fproductUnitPrice = 0.0;
double myval = 99999.99;
double myval2 = 99999.95;
float myval3 = 99999.99;
from_string<double>(fproductUnitPrice, elementData, std::dec);
cout << "fproductUnitPrice=" << fproductUnitPrice << endl;
fproductUnitPrice -= 0.05;
cout << "fproductUnitPrice=" << fproductUnitPrice << endl;
cout << "myval=" << myval << endl;
cout << "myval2=" << myval2 << endl;
cout << "myval3=" << myval3 << endl;
printf("myval %lf\n", myval);
printf("myval2 %lf\n", myval2);
printf("myval3 %lf\n", myval3);
}
int main(int argc, char* argv[])
{
MyApp myApp;
myApp.run();
}