JAVA中double在运算时的精度缺失问题

#double的运算问题
我们都知道double类型的精度要比float的高一些,但double类型的精度就一定准确嘛?

在这里插入图片描述
在这里插入图片描述
程序运行结果并非0.6,这就是double在运算时的精度缺失问题,当然并不是所有的运算都会出现这个问题,但是只要出现就一定会影响运算结果,如果是经常跟数字打交道列如银行,一旦发生可是无法想象。
#double精度缺失的原因
为什么double会出先这个问题呢?这是由于我们输入的十进制的 double 类型的数据在进行计算的时候,计算机会先将其转换为二进制数据,然后再进行相关的运算。
然而在十进制转二进制的过程中,有些十进制数是无法使用一个有限的二进制数来表达的,换言之就是转换的时候出现了精度的丢失问题,所以导致最后在运算的过程中,会出现精度缺失问题。
这里就不大篇幅讲解进制转换的原理了;
#那么怎样解决这类问题呢?
普遍有两种方法可以解决,第一种是将其double类型数据运算后格式化 DecimalFormat然后再转为double类型

另一种方法是调用Math库里的一个类,也是比较常见的方法Bigdecimal

    DecimalFormat df1 = new DecimalFormat("0.0000000000");
    double height=1.5;
     double low=1.4;
   double c= Double.valueOf(df.format(height-low));

   BigDecimal bigDecimal2 = new BigDecimal(Double.toString(2001299.32));

两种方法各有好处,格式化方法和Bigdecimal方法各种的用途JDK api里都有详细说明。

下一篇我会发一道2019年阿里的一道面试题,里面大体思路是让自己写一个sqrt()方法,网上的算法几乎都忽略了double在运算时的精度缺失问题,所以根本无法得出正确答案,也不知道他们运行过没有…

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值