赞
踩
BigDecimal 由任意精度的整数非标度值 和32 位的整数标度 (scale) 组成。如果为零或正数,则标度是小数点后的位数。
如果为负数,则将该数的非标度值乘以 10 的负scale 次幂。因此,BigDecimal表示的数值是(unscaledValue × 10-scale)。
- 构造 BigDecimal 对象常用以下方法:
- BigDecimal BigDecimal(double d); //不允许使用
- BigDecimal BigDecimal(String s); //常用,推荐使用
- static BigDecimal valueOf(double d); //常用,推荐使用
- /**
- * 求余数
- * 返回值为 (this % divisor) 的 BigDecimal
- */
- BigDecimal remainder(BigDecimal divisor);
-
- /**
- * 求相反数
- * 返回值是 (-this) 的 BigDecimal
- */
- BigDecimal negate();
-
- /**
- * 将此 BigDecimal 与指定的 BigDecimal 比较
- * 根据此方法,值相等但具有不同标度的两个 BigDecimal 对象(如,2.0 和 2.00)被认为是相等的;
- * 相对六个 boolean 比较运算符 (<, ==, >, >=, !=, <=) 中每一个运算符的各个方法,优先提供此方法;
- * 建议使用以下语句执行上述比较:(x.compareTo(y) <op> 0), 其中 <op> 是六个比较运算符之一;
- *
- * 指定者:接口 Comparable<BigDecimal> 中的 compareTo
- * 返回:当此 BigDecimal 在数字上小于、等于或大于 val 时,返回 -1、0 或 1
- */
- int compareTo(BigDecimal val);
![](https://csdnimg.cn/release/blogv2/dist/pc/img/newCodeMoreWhite.png)
- package com.util;
-
- import java.math.BigDecimal;
-
- /**
- * 提供精确的浮点数运算(包括加、减、乘、除、四舍五入)工具类
- */
- public class ArithUtil {
-
- // 除法运算默认精度
- private static final int DEF_DIV_SCALE = 10;
-
- private ArithUtil() {
-
- }
-
- /**
- * 精确加法
- */
- public static double add(double value1, double value2) {
- BigDecimal b1 = BigDecimal.valueOf(value1);
- BigDecimal b2 = BigDecimal.valueOf(value2);
- return b1.add(b2).doubleValue();
- }
-
- /**
- * 精确减法
- */
- public static double sub(double value1, double value2) {
- BigDecimal b1 = BigDecimal.valueOf(value1);
- BigDecimal b2 = BigDecimal.valueOf(value2);
- return b1.subtract(b2).doubleValue();
- }
-
- /**
- * 精确乘法
- */
- public static double mul(double value1, double value2) {
- BigDecimal b1 = BigDecimal.valueOf(value1);
- BigDecimal b2 = BigDecimal.valueOf(value2);
- return b1.multiply(b2).doubleValue();
- }
-
- /**
- * 精确除法 使用默认精度
- */
- public static double div(double value1, double value2) throws IllegalAccessException {
- return div(value1, value2, DEF_DIV_SCALE);
- }
-
- /**
- * 精确除法
- * @param scale 精度
- */
- public static double div(double value1, double value2, int scale) throws IllegalAccessException {
- if(scale < 0) {
- throw new IllegalAccessException("精确度不能小于0");
- }
- BigDecimal b1 = BigDecimal.valueOf(value1);
- BigDecimal b2 = BigDecimal.valueOf(value2);
- // return b1.divide(b2, scale).doubleValue();
- return b1.divide(b2, scale, BigDecimal.ROUND_HALF_UP).doubleValue();
- }
-
- /**
- * 四舍五入
- * @param scale 小数点后保留几位
- */
- public static double round(double v, int scale) throws IllegalAccessException {
- return div(v, 1, scale);
- }
-
- /**
- * 比较大小
- */
- public static boolean equalTo(BigDecimal b1, BigDecimal b2) {
- if(b1 == null || b2 == null) {
- return false;
- }
- return 0 == b1.compareTo(b2);
- }
- }
![](https://csdnimg.cn/release/blogv2/dist/pc/img/newCodeMoreWhite.png)
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。