我是靠谱客的博主 激情钢笔,最近开发中收集的这篇文章主要介绍c++加载json文件中double类型精度丢失解决方法,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

项目中需要把conf.json文件中的浮点类型加载出来并放大100倍使用,但实际项目中遇到精度丢失的问题,比如浮点数是1078.60,加载出来后按常规逻辑 * 100 实际得到结果为 107859。精确度丢失了,为解决问题,我使用了下面简单方法避免了这种情况,而不需要使用类似GMP等高精度库。代码如下:

using namespace std;

//截取double小数点后2位,直接截断并乘以100转int64_t
int64_t getDouble100(std::string const &s)
{
    std::string::size_type npos = s.find_first_of('.');
    if (npos != std::string::npos)
    {
        std::string prefix = s.substr(0, npos);
        std::string sufix = s.substr(npos + 1, -1);
        std::string x;
        if (!sufix.empty())
        {
            if (sufix.length() >= 2)
            {
                x = prefix + sufix.substr(0, 2);
            }
            else
            {
                x = prefix + sufix.substr(0, 1) + "0";
            }
        }
        return atoll(x.c_str());
    }
    return atoll(s.c_str()) * 100;
}

// 想要把Json文件中的浮点数读取出来然后放大100倍
int main(int argc, char *argv[])
{
    //创建一个结构对象    
    boost::property_tree::ptree root;
    //读文件存放到root中 
    boost::property_tree::read_json<boost::property_tree::ptree>("./conf.json", root);
    double test         = root.get<double>("test");
    double fbalance     = root.get<double>("data.balance");
    double fbalance2    = root.get<double>("data.balance2");

    // 想要的结果
    int64_t _testValue = test * 100;
    int64_t _balanceValue = fbalance * 100;
    int64_t _balanceValue2 = fbalance2 * 100;

    std::cout << "===============正常处理结果=================="<< std::endl;
    std::cout << "test     想要得到的结果 107860" << std::endl;
    std::cout << "balance  想要得到的结果 107860" << std::endl;
    std::cout << "balance2 想要得到的结果 105860" << std::endl;

    std::cout << "实际得到的结果test:" << _testValue << std::endl;
    std::cout << "实际得到的结果balance:" << _balanceValue << std::endl;
    std::cout << "实际得到的结果balance2:" << _balanceValue2 << std::endl;
    std::cout << "===============经转字符串处理后=================="<< std::endl;

    // 转字符串
    string testStr = to_string(test);
    string balanceStr = to_string(fbalance);
    string balance2Str = to_string(fbalance2);

    // 字符串再转整数
    int64_t newTest = getDouble100(testStr);
    int64_t newBalance = getDouble100(balanceStr);
    int64_t newBalance2 = getDouble100(balance2Str);
    std::cout << "处理后得到的结果test:" << newTest << std::endl;
    std::cout << "处理后得到的结果balance:" << newBalance << std::endl;
    std::cout << "处理后得到的结果balance2:" << newBalance2 << std::endl;

    return 0;
}

conf.json文件如下:

{
    "data":
    {
        "balance":1078.60,
        "balance2":1058.60
    },
   "test": 1078.60
}

运行结果:

===============正常处理结果==================
test     想要得到的结果 107860
balance  想要得到的结果 107860
balance2 想要得到的结果 105860
实际得到的结果test:107859
实际得到的结果balance:107859
实际得到的结果balance2:105859
===============经转字符串处理后==================
处理后得到的结果test:107860
处理后得到的结果balance:107860
处理后得到的结果balance2:105860

 

最后

以上就是激情钢笔为你收集整理的c++加载json文件中double类型精度丢失解决方法的全部内容,希望文章能够帮你解决c++加载json文件中double类型精度丢失解决方法所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(52)

评论列表共有 0 条评论

立即
投稿
返回
顶部