Lenhoon 2015-03-03 17:45 采纳率: 0%
浏览 4618

C++ double变量的精度损失问题!!!

使用如下语句输出
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,请问这种问题该如何解决????

  • 写回答

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

    评论

报告相同问题?

悬赏问题

  • ¥20 腾讯企业邮箱邮件可以恢复么
  • ¥15 有人知道怎么将自己的迁移策略布到edgecloudsim上使用吗?
  • ¥15 错误 LNK2001 无法解析的外部符号
  • ¥50 安装pyaudiokits失败
  • ¥15 计组这些题应该咋做呀
  • ¥60 更换迈创SOL6M4AE卡的时候,驱动要重新装才能使用,怎么解决?
  • ¥15 让node服务器有自动加载文件的功能
  • ¥15 jmeter脚本回放有的是对的有的是错的
  • ¥15 r语言蛋白组学相关问题
  • ¥15 Python时间序列如何拟合疏系数模型