BigDecimal类的加减乘除(解决double计算精度问题)

  • BigDecimal简介
    Java在java.math包中提供的API类BigDecimal,用来对超过16位有效位的数进行精确的运算。双精度浮点型变量double可以处理16位有效数。在实际应用中,需要对更大或者更小的数进行运算和处理。float和double只能用来做科学计算或者是工程计算,在商业计算中要用java.math.BigDecimal。BigDecimal所创建的是对象,我们不能使用传统的+、-、*、/等算术运算符直接对其对象进行数学运算,而必须调用其相对应的方法。方法中的参数也必须是BigDecimal的对象。构造器是类的特殊方法,专门用来创建对象,特别是带有参数的对象。
  • BigDecimal类的常用方法
序号方 法类型描 述
1public BigDecimal(double val)构造将double表示形式转换为BigDecimal
2public BigDecimal(int val)构造将int表示形式转换为BigDecimal
3public BigDecimal(String val)构造将字符串表示形式转换为BigDecimal
4public BigDecimal add(BigDecimal augend)普通加法
5public BigDecimal subtract(BigDecimalsubtrahend)普通减法
6public BigDecimal multiply(BigDecimalmultiplicand)普通乘法
7public BigDecimal divide(BigDecimaldivisor)普通除法
  • 在我们使用double来计算时,有时候会出现小数点后面00000003(例如:10.0000000003),是因为java底层对数值的运算是通过二进制进行计算的。

  • 示例代码

package com.example.MyBigDecimal;

import java.math.BigDecimal;

class MyBigDecimal {
    public static double add(double d1, double d2) { // 进行加法运算
        BigDecimal b1 = new BigDecimal(d1);
        BigDecimal b2 = new BigDecimal(d2);
        return b1.add(b2).doubleValue();
    }

    public static double sub(double d1, double d2) { // 进行减法运算
        BigDecimal b1 = new BigDecimal(d1);
        BigDecimal b2 = new BigDecimal(d2);
        return b1.subtract(b2).doubleValue();
    }

    public static double mul(double d1, double d2) { // 进行乘法运算
        BigDecimal b1 = new BigDecimal(d1);
        BigDecimal b2 = new BigDecimal(d2);
        return b1.multiply(b2).doubleValue();
    }

    public static double div(double d1, double d2, int len) {// 进行除法运算
        BigDecimal b1 = new BigDecimal(d1);
        BigDecimal b2 = new BigDecimal(d2);
        return b1.divide(b2, len, BigDecimal.ROUND_HALF_UP).doubleValue();
    }

    public static double round(double d,int len) {     // 进行四舍五入操作
         BigDecimal b1 = new BigDecimal(d);
         BigDecimal b2 = new BigDecimal(1);
        // 任何一个数字除以1都是原数字
        // ROUND_HALF_UP是BigDecimal的一个常量,表示进行四舍五入的操作
        return b1.divide(b2, len,BigDecimal.ROUND_HALF_UP).doubleValue();
     }
}
  • 使用上面的工具类进行计算
public class BigDecimalDemo {
    public static void main(String[] args) {
         System.out.println("加法运算:" + MyBigDecimal.round(MyBigDecimal.add(10.345,3.333), 1));
         System.out.println("乘法运算:" + MyBigDecimal.round(MyBigDecimal.mul(10.345,3.333), 3));
         System.out.println("除法运算:" +MyBigDecimal.div(10.345, 3.333, 3));
         System.out.println("减法运算:" +MyBigDecimal.round(MyBigDecimal.sub(10.345,3.333), 3));
     }
}
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
唔,其实里面就是一个工具加减乘除、保留两位小数。一共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: BigDecimal 是 Java 中用于高精度计算,可以进行加减乘除等基本运算,以下是这些运算的示例代码: 加法: ```java BigDecimal a = new BigDecimal("1.23"); BigDecimal b = new BigDecimal("4.56"); BigDecimal c = a.add(b); System.out.println(c); // 输出 5.79 ``` 减法: ```java BigDecimal a = new BigDecimal("1.23"); BigDecimal b = new BigDecimal("4.56"); BigDecimal c = a.subtract(b); System.out.println(c); // 输出 -3.33 ``` 乘法: ```java BigDecimal a = new BigDecimal("1.23"); BigDecimal b = new BigDecimal("4.56"); BigDecimal c = a.multiply(b); System.out.println(c); // 输出 5.6088 ``` 除法: ```java BigDecimal a = new BigDecimal("1.23"); BigDecimal b = new BigDecimal("4.56"); BigDecimal c = a.divide(b, 2, RoundingMode.HALF_UP); System.out.println(c); // 输出 0.27 ``` 其中,`divide` 方法的第二个参数表示结果的小数位数,第三个参数表示舍入模式。这里使用的是 `RoundingMode.HALF_UP`,表示四舍五入。 ### 回答2: BigDecimal 是 Java 中用于精确计算。它可以处理比基本数据型(如 int 和 double)更大范围的数字,并且可以避免浮点数运算的精度丢失问题。 在 BigDecimal 中,加法、减法、乘法和除法操作都有相应的方法可以调用。 1. 加法:使用 add 方法进行加法运算,可以将两个 BigDecimal 对象相加得到一个新的 BigDecimal 对象。例如,要计算 2.5 + 1.3,可以使用如下代码: ```java BigDecimal num1 = new BigDecimal("2.5"); BigDecimal num2 = new BigDecimal("1.3"); BigDecimal result = num1.add(num2); ``` 2. 减法:使用 subtract 方法进行减法运算,可以将一个 BigDecimal 对象减去另一个 BigDecimal 对象得到一个新的 BigDecimal 对象。例如,要计算 5.8 - 3.2,可以使用如下代码: ```java BigDecimal num1 = new BigDecimal("5.8"); BigDecimal num2 = new BigDecimal("3.2"); BigDecimal result = num1.subtract(num2); ``` 3. 乘法:使用 multiply 方法进行乘法运算,可以将两个 BigDecimal 对象相乘得到一个新的 BigDecimal 对象。例如,要计算 2.5 * 1.3,可以使用如下代码: ```java BigDecimal num1 = new BigDecimal("2.5"); BigDecimal num2 = new BigDecimal("1.3"); BigDecimal result = num1.multiply(num2); ``` 4. 除法:使用 divide 方法进行除法运算,可以将一个 BigDecimal 对象除以另一个 BigDecimal 对象得到一个新的 BigDecimal 对象。例如,要计算 5.8 / 3.2,可以使用如下代码: ```java BigDecimal num1 = new BigDecimal("5.8"); BigDecimal num2 = new BigDecimal("3.2"); BigDecimal result = num1.divide(num2); ``` 需要注意的是,除法运算可能会抛出 ArithmeticException 异常,如除数为零或除不尽时。因此,可以在除法运算前进行合适的异常处理。 通过使用 BigDecimal加减乘除方法,我们可以对需要更高精度的数值进行运算,避免了浮点数运算中的精度问题。 ### 回答3: BigDecimal是Java中提供的用于处理精确小数运算的。它可以用于实现加减乘除等基本算术运算。 在BigDecimal中,加法和减法的使用非常简单。我们可以通过调用`add()`方法实现两个BigDecimal对象的加法运算,也可以通过调用`subtract()`方法实现两个BigDecimal对象的减法运算。例如,要将两个BigDecimal对象num1和num2相加,可以使用如下代码: ```java BigDecimal result = num1.add(num2); ``` 要将两个BigDecimal对象num1和num2相减,可以使用如下代码: ```java BigDecimal result = num1.subtract(num2); ``` 对于乘法运算,我们可以使用`multiply()`方法。该方法可以将一个BigDecimal对象与另一个BigDecimal对象相乘,也可以将BigDecimal对象与整数或浮点数相乘。例如,要将两个BigDecimal对象num1和num2相乘,可以使用如下代码: ```java BigDecimal result = num1.multiply(num2); ``` 要将BigDecimal对象num1与整数或浮点数相乘,可以使用如下代码: ```java BigDecimal result = num1.multiply(new BigDecimal("10")); // 将num1乘以10 ``` 在BigDecimal中,除法运算相对复杂一些。我们可以使用`divide()`方法实现两个BigDecimal对象的除法运算,需要指定除法运算的精确度和舍入规则。例如,要将BigDecimal对象num1除以num2,指定运算结果的精确度为10,可以使用如下代码: ```java BigDecimal result = num1.divide(num2, 10, RoundingMode.HALF_UP); ``` 其中,第一个参数是除数,第二个参数是精确度,第三个参数是舍入规则。 总之,BigDecimal提供了实现精确小数运算的方法,可以实现加法、减法、乘法和除法等基本算术运算。对于除法运算,需要注意指定精确度和舍入规则。使用BigDecimal可以避免使用浮点数造成的精度丢失问题,使得计算结果更加准确。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值