浮点数的精确计算

Java的double类型无法精确表示浮点数,如0.1和0.3的运算结果会有误差。为实现精确计算,需使用BigDecimal类,通过valueOf方法或构造函数传入字符串形式的浮点数。BigDecimal的运算结果是精确的,适合需要精确计算的场景。
摘要由CSDN通过智能技术生成
  1. java没办法用二进制精确的表示浮点数
  double d = 0.1;
  //这可以看出变量d的真实值
  System.out.println(new BigDecimal(0.1).toString());//结果:0.1000000000000000055511151231257827021181583404541015625
  //这里是0.1,是因为被格式化输出了,这种格式化的结果有时也是不对的
  System.out.println(d);//结果是0.1
  1. 直接使用浮点数的计算结果同样没法精确表示
  double d = 0.1;
  double f = 0.3;
  //虽然格式化了,但是结果也不对
  System.out.println(0.3 / 0.1);//结果:2.9999999999999996
  //计算的结果仍是错误的
  System.out.println(new BigDecimal(0.3 /  0.1).toString());//结果:2.999999999999999555910790149937383830547332763671875
  1. BigDecimal.valueOf(0.3)或者new BigDecimal(Double.toString(0.3))构造BigDecimal对象才能进行精确计算
double d = 0.1;
double f = 0.3;
//精确计算
System.out.println(BigDecimal.valueOf(f).divide(BigDecimal.valueOf(d)));//结果是3
System.out.println(new  BigDecimal(Double.toString(f)).divide(new  BigDecimal(Double.toString(d))));//结果为3

结论:

  1. 浮点数如果不进行运算,只进行传递和存储可以用double类型表示,虽然是不精确的,但不会有太大影响,如果进行运算或比较必须用BigDecimal处理。
  2. BigDecimal的运算结果是精确的,小数位数量是确定的,不会出现无限小数位的情况(除非本身就是1/3这种除不尽情况),可以认为就是现实中的浮点数运算。
  3. BigDecimal的运算可以用BigDecimal.doubleValue()表示,结果同1
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值