Cha*_*han 27 c++ precision double tostring
我需要帮助来保持精确度double.如果我将文字分配给double,则实际值会被截断.
int main() {
    double x = 7.40200133400;
    std::cout << x << "\n";
}
对于上面的代码片段,输出7.402
是否有办法防止这种类型的截断?或者有没有办法计算出多少浮点数double?例如,number_of_decimal(x)会给出11,因为输入在运行时是未知的,所以我不能使用setprecision().
我想我应该将我的问题改为:如何在不截断浮点的情况下将double转换为字符串.即
#include <iostream>
#include <string>
#include <sstream>
template<typename T>
std::string type_to_string( T data ) {
    std::ostringstream o;
    o << data;
    return o.str();
}
int main() {
    double x = 7.40200;
    std::cout << type_to_string( x ) << "\n";
}
预期产量应为7.40200,但实际结果为7.402.那么我该如何解决这个问题呢?任何的想法?
fre*_*low 31
由于事实float和double内部存储二进制,文字7.40200133400实际上代表数字7.40200133400000037653398976544849574565887451171875
......你真的想要多少精确度?:-)
#include <iomanip>    
int main()
{
    double x = 7.40200133400;
    std::cout << std::setprecision(51) << x << "\n";
}
是的,这个程序真的打印7.40200133400000037653398976544849574565887451171875!
Max*_*xpm 18
你必须使用setiosflags(ios::fixed)和setprecision(x).
例如, cout << setiosflags(ios::fixed) << setprecision(4) << myNumber << endl;
另外,别忘了#include <iomanip.h>.
std::cout << std::setprecision(8) << x;
请注意,这setprecision是持久性的,您打印的所有下一个浮动将以该精度打印,直到您将其更改为其他值.如果这是一个问题而你想解决这个问题,你可以使用代理stringstream对象:
std::stringstream s;
s << std::setprecision(8) << x;
std::cout << s.str();
有关iostream格式的更多信息,请查看cppreference中的输入/输出操纵器部分.
使用Boost.Format的解决方案:
#include <boost/format.hpp>
#include <iostream>
int main() {
    double x = 7.40200133400;
    std::cout << boost::format("%1$.16f") % x << "\n";
}
这输出7.4020013340000004.
希望这可以帮助!
| 归档时间: | 
 | 
| 查看次数: | 83859 次 | 
| 最近记录: |