关于double类型运算出现误差的原因及解决办法

因为这个小问题把仿真平台跑了一遍又一遍的菜鸡表示哭晕在厕所。。。

鉴于本来对平台就不是很熟,又遇到这么小的点在平台里,真是“福气”。

double属于floating binary point types,double型在运算使会先将数值转换成二进制的数值表示再做运算,但是在转换成二进制代码表示的时候,存储小数部分的位数会有不够的现象,即无限循环小数,故会有非常小的误差,但此时若进行==的判断则会出问题,菜鸡本鸡就死在了这里。下文中对原因讲述很清楚,还给出了java的解决办法。
https://blog.csdn.net/dongapple/article/details/76974624?depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-3&utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-3

而对于其他语言环境,则可采用:
1、在误差要求较低时:乘以一个整数10000或者100000,加上0.00001或0.000005之后无条件舍去小数,再除以前面乘上的数值;
2、将要使用的数小数点右移,改成int型进行比较,用到具体数值的时候再进行处理;
3、避免使用==来判断浮点数,此次采用在二者相差在一定范围内的时候认为二者相等,将其加入同一时刻的事件队列,问题迎刃而解;
4、还有人提到可以自己封装一个类,也有人说可以将int还是double型重新封装一下,不知道是不是和java里的封装异曲同工。不过菜鸡本鸡是不断然不会这么高端的操作的,希望当菜鸡不再菜的时候能会吧,哈哈哈哈。。。所有菜鸡本鸡弱弱地认为,对自己来说,更好的办法也许是,用不起躲得起的战略,避免使用double类型进行操作。。。

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在程序中,两个double类型相加出现误差的主要原因是浮点数的内部表示方式和精度问题。浮点数在计算机中使用二进制来表示,但有些十进制数无法精确地表示为有限位数的二进制表示,因此会引发舍入误差。 要解决这个问题,我们可以采取以下几个方法: 1. 使用BigDecimal类:BigDecimal类可以提供高精度的十进制运算,可以避免浮点数运算中的舍入误差。可以先将两个double数转换为BigDecimal对象,然后使用add方法进行相加。 2. 当需要比较两个浮点数是否相等时,可以采用比较它们的差值小于某个极小值的方法,而不是直接比较它们是否完全相等。例如,可以定义一个极小值epsilon,并判断Math.abs(a - b) < epsilon来比较。 3. 将浮点数转换为整数进行计算。可以将两个double数乘以一个合适的倍数(如10000),然后将其转换为整数进行相加操作。最后再将结果除以相同的倍数,得到精确的结果。 4. 在使用浮点数的时候,应尽量避免累加操作。因为每次累加都会引入额外的舍入误差。可以尽量减少累加操作,并在必要时使用中间变量来存储结果,以避免精度损失。 综上所述,避免浮点数运算误差的方法包括使用BigDecimal类、比较差值、转换为整数运算以及避免累加操作等。在实际编程中,我们需要根据具体情况选择最适合的方法来解决浮点数误差问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值