我是靠谱客的博主 秀丽音响,最近开发中收集的这篇文章主要介绍[C++] double 精度丢失问题,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

文章目录

    • 场景
      • 错误方案1
      • 错误方案2
      • 正确方案

场景

double 保留8位小数,且四舍五入

错误方案1

typedef long long int64;
int main()
{
    double v1 = 5726.867366095;
    double v2 = 5837.754018494999;
    const int64 N = pow(10, 8);
    double newV1 = (int64)(round(v1 * N)) / double(N);
    double newV2 = (int64)(round(v2 * N)) / double(N);
    printf("%.8fn", newV1);
    printf("%.8fn", newV2);
}

out:

5726.86736610
5837.75401850 << 错了

错误方案2

#include <boost/multiprecision/cpp_dec_float.hpp>

using boost::multiprecision::number;
using boost::multiprecision::cpp_dec_float;
typedef number<cpp_dec_float<50> > cpp_dec_float_50;
typedef long long int64;

int main()
{
    cpp_dec_float_50 v1 = 5726.867366095; // v1 实际等于 5726.867366094999
    cpp_dec_float_50 v2 = 5837.754018494999;
    const int64 N = pow(10, 8);
    double newV1 = (int64)round(v1 * N) / double(N);
    double newV2 = (int64)round(v2 * N) / double(N);
    printf("%.8fn", newV1);
    printf("%.8fn", newV2);
}

out:

5726.86736609 << 错了
5837.75401849

正确方案

#include <boost/multiprecision/cpp_dec_float.hpp>

using boost::multiprecision::number;
using boost::multiprecision::cpp_dec_float;
typedef number<cpp_dec_float<50> > cpp_dec_float_50;
typedef long long int64;

int main()
{
    cpp_dec_float_50 v1("5726.867366095");    // 为防止精度丢失,只能以字符串形式赋值,
    cpp_dec_float_50 v2("5837.754018494999"); // 否则就是把错误的值赋给了对象,初值就错了
    const int64 N = pow(10, 8);
    double newV1 = (int64)round(v1 * N) / double(N);
    double newV2 = (int64)round(v2 * N) / double(N);
    printf("%.8fn", newV1);
    printf("%.8fn", newV2);
}

out:

5726.86736610
5837.75401849

最后

以上就是秀丽音响为你收集整理的[C++] double 精度丢失问题的全部内容,希望文章能够帮你解决[C++] double 精度丢失问题所遇到的程序开发问题。

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

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

评论列表共有 0 条评论

立即
投稿
返回
顶部