vb字符串数值:Boost库中的数值到字符串的转换改进来源: 发布时间:星期四, 2009年2月12日 浏览:100次 评论:0
Boost库中lexical_cast功能很强大但存在个浮点数精度问题在阿炯走进Boost中描述如下: # <boost/lexical_cast.hpp> # <> # <iostream> { using std::; const double d = 123.1234567; s = boost::lexical_<>(d); std::cout<<s<<std::endl; 0; } 以上预想结果是得到:"123.1234567"但是实际上我们只会得到"123.123"默认情况下std::stream精度是6这算是boost::lexical_cast个bug 阿炯提供个解决办法: 对头文件<boost/lexical_cast.hpp>作如下修改: //.... template<typename Target, typename Source> Target lexical_cast(Source arg) { //..... Target result; //以上行是增加内容 erpreter.precision(std::numeric_limits<Source>::digits10); (!(erpreter<<arg)||!(erpreter>>result)||!(erpreter>>std::ws).eof) //......... } 我按照上述思路方法在我机器上如何也得不到正确结果(BCB 6) 就算可行话也存在以下问题:只能得到种精度串 我使用以下思路方法解决以上问题: 利用C中重载机制增加个: template<typename Target, typename Source> Target lexical_cast(Source arg) { //...... Target result; (!(erpreter << arg) || !(erpreter >> result) || !(erpreter >> std::ws).eof) //.... } template<typename Target, typename Source> // 下面行修改了 Target lexical_cast(Source arg, length) { # def BOOST_LEXICAL_CAST_USE_STRSTREAM std::strstream erpreter; // for out-of-the-box g 2.95.2 # std::stream erpreter; # end Target result; // 增加下面行 erpreter.precision( length ); (!(erpreter << arg) || !(erpreter >> result) || !(erpreter >> std::ws).eof) throw bad_lexical_cast; result; } } 使用时如下: std:: s = boost::lexical_cast<std::>(123.1234567,10); 即可以得到正确结果而且原来不变 小结 不管多好东西总会有些小问题和不如意东西能够自己动手加以改进是很好事 0
相关文章读者评论发表评论 |
|