使用如下语句输出
cout.setf(ios::fixed);
cout<<setprecision(3)<<14.5*0.01;//此时输出为0.145;
cout<<setprecision(2)<<14.5*0.01;//此时输出是0.14,按照四舍五入此时应该输出的是0.15啊!!!调试变量观察14.5*0.01 double型的值为0.149999999999999999999999,但是如果直接出入保存到double型中是都不会有精度损失,只要一和double运算则0.145都会自动变为0.149999999999999,请问这种问题该如何解决????
C++ double变量的精度损失问题!!!
- 写回答
- 好问题 0 提建议
- 追加酬金
- 关注问题
- 邀请回答
-
2条回答
- 什么龙 2015-03-04 01:09关注
首先,计算机是二进制表示,这个你应该知道了,而每位都是一个2多少次幂,比如整数范围就是从2的0次方开始,而小数就是从2的-1次方开始,
然后把所有的结果加在一起来表示这个数。
如:5 二进制为101 因为2的2次方加上2的0次方
0.5 为 .1 为2的-1次方
而0.145 表示为
0.5 0.25 0.125 0.0625 0.03125 ……
0 0 1 0 0
这样计算加下去,得不到一个0.145这样正好相等的树,所有就变成了0.149999999……
而正常保留是舍弃的,你如果想要四舍五入简单做法是在精度的后边第一位加上5,然后在执行
如:
0.145 保留2位,可以加上0.005 得到0.150 取精度后得到0.15解决 3无用
悬赏问题
- ¥15 c程序不知道为什么得不到结果
- ¥40 复杂的限制性的商函数处理
- ¥15 程序不包含适用于入口点的静态Main方法
- ¥15 素材场景中光线烘焙后灯光失效
- ¥15 请教一下各位,为什么我这个没有实现模拟点击
- ¥15 执行 virtuoso 命令后,界面没有,cadence 启动不起来
- ¥50 comfyui下连接animatediff节点生成视频质量非常差的原因
- ¥20 有关区间dp的问题求解
- ¥15 多电路系统共用电源的串扰问题
- ¥15 slam rangenet++配置