概述
文章目录
- 场景
- 错误方案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 精度丢失问题所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复