专注于互联网--专注于架构

最新标签
网站地图
文章索引
Rss订阅

首页 »C 教程 » vb字符串数值:Boost库中的数值到字符串的转换改进 »正文

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

相关文章

读者评论

发表评论

  • 昵称:
  • 内容: