关于Java中使用double类型的数进行加减出现精度不准确问题

问题描述

public class DoubleTest {
    public static void main(String[] args) {
        double d1 = 148163.1;
        double d2 = 82692.09;
        System.out.println(d1 - d2);
    }
}

运行结果:
在这里插入图片描述
从上图我们可以看出,结果本应该是65471.01,但是却出现精度不准确的问题.

原因

  • double类型在进行加减的时候,会将数值转换成二进制的数值,但是在转换成二进制代码表示的时候,储存小数部分的位数会有不够的现象,即无限循环小数.(double转换为二进制数进行计算会丢失位数导致精度不准确);

解决方案

通过使用BigDecimal类来解决该问题;

public class DoubleTest {
    public static void main(String[] args) {
        BigDecimal d1 = new BigDecimal("148163.1");
        BigDecimal d2 = new BigDecimal("82692.09");
        System.out.println(d1.subtract(d2));
    }
}

在这里插入图片描述

从上图,我们可以看出使用了BigDecimal类之后,这个精度缺失的现象就没有了.
注意: 这里我们在使用构造函数的时候传递的是字符串,而不是之间传入double类型的数;
在这里插入图片描述
其他运算符类比学习~

  • 5
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
唔,其实里面就是一个工具类,加减乘除、保留两位小。一共5个方法。。。emmmm.....为啥分这么高呢。因为宝宝想分想疯了。 附代码,有土豪就打赏打赏,没土豪的直接拿去使吧。 package cn.cisdom.base.utils; import java.math.BigDecimal; import java.text.DecimalFormat; public class Calculation { public static final DecimalFormat df = new DecimalFormat("######0.00"); /** * @methodName format2point * @desc 保留两位小点 * @param value * @return java.lang.String * @author xm * @create 2018/6/7 12:03 **/ public static String format2point(Number value) { return df.format(value); } public static Double add(Number value1, Number value2) { BigDecimal b1 = new BigDecimal(Double.toString(value1.doubleValue())); BigDecimal b2 = new BigDecimal(Double.toString(value2.doubleValue())); return b1.add(b2).doubleValue(); } /** * 提供精确的减法运算。 * * @param value1 * 减 * @param value2 * 被减 * @return 两个参的差 */ public static Double sub(Number value1, Number value2) { BigDecimal b1 = new BigDecimal(Double.toString(value1.doubleValue())); BigDecimal b2 = new BigDecimal(Double.toString(value2.doubleValue())); return b1.subtract(b2).doubleValue(); } /** * 提供精确的乘法运算。 * * @param value1 * 被乘 * @param value2 * 乘 * @return 两个参的积 */ public static Double mul(Number value1, Number value2) { BigDecimal b1 = new BigDecimal(Double.toString(value1.doubleValue())); BigDecimal b2 = new BigDecimal(Double.toString(value2.doubleValue())); return b1.multiply(b2).doubleValue(); } /** * 提供精确的除法运算。 * * @param value1 * 除 * @param value2 * 被除 * @return 除/被除 */ public static Double div(Number value1, Number value2) { //MathContext mc = new MathContext(2, RoundingMode.HALF_DOWN);//精度为2,舍入模式为大于0.5进1,否则舍弃 BigDecimal b1 = new BigDecimal(Double.toString(value1.doubleValue())); BigDecimal b2 = new BigDecimal(Double.toString(value2.doubleValue())); return b1.divide(b2).doubleValue(); } public static void main(String[] args) { Double aDouble=Calculation.add(56.9, 1.67); System.out.println(aDouble); Double bDouble=Calculation.sub(99.2,aDouble); System.out.println(bDouble); } }
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

阿胡爱编程

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值