金钱在类型and工具类


一、金钱类型

1、java中类型

1.1、BigDecimal和BigInteger

文档

java.math.BigDecimal 不变的,任意精度的带符号的十进制数字。

public class BigDecimal extends Number implements Comparable

BigDecimal的就是防止金钱数据失真,在实际使用场景中,金钱是不允许有失真或者四舍五入这样的出现的,金钱必须精确,

对应BigDecimal这个东西是一个对象,在操作其的时候需要使用对应的方法操作

  • add(BigDecimal)
    BigDecimal对象中的值相加,返回BigDecimal对象
  • subtract(BigDecimal)
    BigDecimal对象中的值相减,返回BigDecimal对象
  • multiply(BigDecimal)
    BigDecimal对象中的值相乘,返回BigDecimal对象
  • divide(BigDecimal)
    BigDecimal对象中的值相除,返回BigDecimal对象
  • toString()
    将BigDecimal对象中的值转换成字符串
  • doubleValue()
    将BigDecimal对象中的值转换成双精度数
  • floatValue()
    将BigDecimal对象中的值转换成单精度数
  • longValue()
    将BigDecimal对象中的值转换成长整数
  • intValue()
    将BigDecimal对象中的值转换成整数
public class BigDecimalUtil {
    /**
     * 常用的常量—1000
     */
    public final static BigDecimal DECIMAL_1000 = new BigDecimal("1000");
    /**
     * 常用的常量—100
     */
    public final static BigDecimal DECIMAL_100 = new BigDecimal("100");
    /**
     * 常用的常量0
     */
    public final static BigDecimal DECIMAL_0 = new BigDecimal("0");
    /**
     * 如果==null or 0返回true
     * @param v
     * @return
     */
    public static Boolean isNullOrZero(BigDecimal v){
        return v == null || v.compareTo(BigDecimal.ZERO) == 0;
    }
    /**
     * 如果==null返回0
     * @param v
     * @return
     */
    public static BigDecimal isNullReturnZero(BigDecimal v){
        return v == null ? BigDecimal.ZERO : v;
    }
    /**
     * 如果==null返回0
     * @param v 请确定是个数字
     * @return
     */
    public static BigDecimal isNullReturnZero(Object v){
        return v == null ? BigDecimal.ZERO : toBigDecimal(v);
    }
    /**
     * 如果==null返回""
     * @param v
     * @return
     */
    public static String isNullReturnBlank(BigDecimal v){
        return v == null ? "" : v.toString();
    }
    /**
     * BigDecimal保留小数
     * 默认进一法
     * @param val 值
     * @return
     */
    public static BigDecimal setScaleUp(BigDecimal val){
        return isNullOrZero(val) ? BigDecimal.ZERO.setScale(2, BigDecimal.ROUND_UP) :
                val.setScale(2, BigDecimal.ROUND_UP);
    }
    /**
     * BigDecimal保留小数
     * @param val 值
     * @param newScale 保留几位小数
     * @return
     */
    public static BigDecimal setScale(BigDecimal val, int newScale){
        return isNullOrZero(val) ? BigDecimal.ZERO.setScale(newScale, BigDecimal.ROUND_HALF_UP) :
                val.setScale(newScale, BigDecimal.ROUND_HALF_UP);
    }
    /**
     * BigDecimal保留小数
     * @param val 值
     * @param newScale 保留几位小数
     * @return
     */
    public static BigDecimal setScale(Object val, int newScale){
        BigDecimal decimal = toBigDecimal(val);
        return isNullOrZero(decimal) ? BigDecimal.ZERO.setScale(newScale, BigDecimal.ROUND_HALF_UP) :
                decimal.setScale(newScale, BigDecimal.ROUND_HALF_UP);
    }
    /**
     * BigDecimal保留小数
     * @param val 值
     * @param newScale 保留几位小数
     * @param roundingMode 保留小数方法
     * @return
     */
    public static BigDecimal setScale(BigDecimal val, int newScale, int roundingMode){
        return isNullOrZero(val) ? BigDecimal.ZERO.setScale(newScale, roundingMode) :
                val.setScale(newScale, roundingMode);
    }
    /**
     * BigDecimal保留小数
     * @param val 值
     * @param newScale 保留几位小数
     * @param roundingMode 保留小数方法
     * @return
     */
    public static BigDecimal setScale(String val, int newScale, int roundingMode){
        BigDecimal bigDecimal = toBigDecimal(val);
        return isNullOrZero(bigDecimal) ? BigDecimal.ZERO.setScale(newScale, roundingMode) :
                bigDecimal.setScale(newScale, roundingMode);
    }
    /**
     * BigDecimal保留小数
     * @param val 值
     * @param newScale 保留几位小数
     * @param roundingMode 保留小数方法
     * @return
     */
    public static BigDecimal setScale(Object val, int newScale, int roundingMode){
        BigDecimal bigDecimal = toBigDecimal(val);
        return isNullOrZero(bigDecimal) ? BigDecimal.ZERO.setScale(newScale, roundingMode) :
                bigDecimal.setScale(newScale, roundingMode);
    }
    /**
     * BigDecimal除法
     * 保留四位小数
     * @param v1 除数
     * @param v2 被除数
     * @return
     */
    public static BigDecimal divide(BigDecimal v1, BigDecimal v2){
        if (v1 == null || v1.compareTo(BigDecimal.ZERO) ==0 || v2 == null || v2.compareTo(BigDecimal.ZERO) == 0){
            return BigDecimal.ZERO;
        }
        return v1.divide(v2, 4, BigDecimal.ROUND_HALF_UP);
    }

    /**
     *
     * BigDecimal除法
     * 指定保留scale位小数
     * @param v1 除数
     * @param v2 被除数
     * @param scale
     * @return
     */
    public static BigDecimal divide(BigDecimal v1, BigDecimal v2, @NotNull Integer scale){
        if (v1 == null || v1.compareTo(BigDecimal.ZERO) ==0 || v2 == null || v2.compareTo(BigDecimal.ZERO) == 0){
            return BigDecimal.ZERO;
        }
        return v1.divide(v2, scale, RoundingMode.HALF_UP);
    }
    /**
     * BigDecimal乘法
     * 保留四位小数 默认四舍五入
     * @param v1
     * @param v2
     * @return
     */
    public static BigDecimal multiply(BigDecimal v1, BigDecimal v2){
        v1 = isNullReturnZero(v1);
        v2 = isNullReturnZero(v2);
        return v1.multiply(v2).setScale(4, BigDecimal.ROUND_HALF_UP);
    }
    /**
     * BigDecimal乘法
     * 保留四位小数 默认四舍五入
     * @param v1 除数
     * @param v2 被除数
     * @return
     */
    public static BigDecimal multiply(BigDecimal v1, BigDecimal v2, int newScale){
        v1 = isNullReturnZero(v1);
        v2 = isNullReturnZero(v2);
        return v1.multiply(v2).setScale(newScale, BigDecimal.ROUND_HALF_UP);
    }

    /**
     *
     * BigDecimal乘法
     * @param v1
     * @param v2
     * @param newScale 保留几位小数
     * @param roundingMode 保留小数的方法
     * @return
     */
    public static BigDecimal multiply(BigDecimal v1, BigDecimal v2, int newScale, int roundingMode){
        if (v2.compareTo(BigDecimal.ZERO) == 0 || v1.compareTo(BigDecimal.ZERO) == 0){
            return BigDecimal.ZERO.setScale(newScale);
        }
        return v1.multiply(v2).setScale(newScale, roundingMode);
    }
    /**
     * BigDecimal加法
     * 保留四位小数 默认四舍五入
     * @param v1 除数
     * @param v2 被除数
     * @return
     */
    public static BigDecimal add(BigDecimal v1, BigDecimal v2){
        v1 = isNullReturnZero(v1);
        v2 = isNullReturnZero(v2);
        return v1.add(v2).setScale(4, BigDecimal.ROUND_HALF_UP);
    }

    /**
     *
     * BigDecimal加法
     * @param v1
     * @param v2
     * @param newScale 保留几位小数
     * @param roundingMode 保留小数的方法
     * @return
     */
    public static BigDecimal add(BigDecimal v1, BigDecimal v2, int newScale, int roundingMode){
        v1 = isNullReturnZero(v1);
        v2 = isNullReturnZero(v2);
        return v1.add(v2).setScale(newScale, roundingMode);
    }
    /**
     * BigDecimal减法
     * 保留四位小数 默认四舍五入
     * @param v1 除数
     * @param v2 被除数
     * @return
     */
    public static BigDecimal subtract(BigDecimal v1, BigDecimal v2){
        v1 = isNullReturnZero(v1);
        v2 = isNullReturnZero(v2);
        return v1.subtract(v2).setScale(4, BigDecimal.ROUND_HALF_UP);
    }
    /**
     * BigDecimal减法
     * 保留四位小数 默认四舍五入
     * @param v1 减数
     * @param v2 被减数
     * @return
     */
    public static BigDecimal subtract(BigDecimal v1, BigDecimal... v2){
        v1 = isNullReturnZero(v1);
        for (BigDecimal decimal : v2) {
            v1 = subtract(v1, isNullReturnZero(decimal), 4, BigDecimal.ROUND_HALF_UP);
        }
        return v1;
    }

    /**
     *
     * BigDecimal减法
     * @param v1
     * @param v2
     * @param newScale 保留几位小数
     * @param roundingMode 保留小数的方法
     * @return
     */
    public static BigDecimal subtract(BigDecimal v1, BigDecimal v2, int newScale, int roundingMode){
        v1 = isNullReturnZero(v1);
        v2 = isNullReturnZero(v2);
        return v1.subtract(v2).setScale(newScale, roundingMode);
    }
    /**
     * Object转BigDecimal类型
     *
     * @param value 传入Object值
     * @return 转成的BigDecimal类型数据
     */
    public static BigDecimal toBigDecimal(Object value) {
        if (value == null || "".equals(value)){
            return null;
        }
        if (value instanceof BigDecimal) {
            return (BigDecimal) value;
        } else if (value instanceof String) {
            return new BigDecimal(String.valueOf(value));
        } else if (value instanceof BigInteger) {
            return new BigDecimal(String.valueOf(value));
        } else if (value instanceof Number) {
            return new BigDecimal(String.valueOf(value));
        } else {
            throw new ClassCastException("Can Not make [" + value + "] into a BigDecimal.");
        }
    }

    public static void main(String[] args) {
        BigDecimal bigDecimalOne = new BigDecimal(10.0);
        BigDecimal bigDecimalTwo = new BigDecimal(5.0);
        System.out.println(bigDecimalOne.divide(bigDecimalTwo,4, RoundingMode.HALF_UP));
    }
}

2、MYSQL中

2.1、Decimal

DECIMAL从MySQL 5.1引入,列的声明语法是DECIMAL(M,D)。在MySQL 5.1中,参量的取值范围如下:

  • M是数字的最大数(精度)。其范围为1~65(在较旧的MySQL版本中,允许的范围是1~254),M 的默认 值是10。
  • D是小数点右侧数字的数目(标度)。其范围是0~30,但不得超过M。

说明:float占4个字节,double占8个字节,decimail(M,D)占M+2个字节。

如DECIMAL(5,2) 的最大值为9 9 9 9 . 9 9,因为有7 个字节可用。

参考文章

个人笔记,不同意见,望有交流
直接可以点击跳转连接

作者 小雨雨hi :【MYSQL】金额(金钱)相关的数据存储类型

posted @ 2022-06-04 16:24  啧啧啧|(* ̄ ̄*)  阅读(12)  评论(0)    收藏  举报  来源