Java中的BigDecimal 和mysql函数之cast去掉字段类型为decimal中后面多余的0

java中的BigDecimal

  1.1 创建一个BigDecimal对象赋初始值最好用string类型的:其他类型,尤其是double会导致BigDecimal的精度缺失出现多小数位的情况

BigDecimal num1 = new BigDecimal(0.005);
BigDecimal num12 = new BigDecimal("0.005");

  1.2 加减乘除和绝对值的方法

//加法
BigDecimal result1 = num1.add(num2);
 
//减法
BigDecimal result2 = num1.subtract(num2);
 
//乘法
BigDecimal result3 = num1.multiply(num2);
 
//绝对值
BigDecimal result4 = num1.abs();
 
//除法
BigDecimal result5 = num1.divide(num2);   

 

  1.3 使用compareTo方法比较

BigDecimal a = new BigDecimal (101);
BigDecimal b = new BigDecimal (111);
 
//注意:a、b均不能为null,否则会报空指针
if(a.compareTo(b) == -1){
    System.out.println("a小于b");
}
 
if(a.compareTo(b) == 0){
    System.out.println("a等于b");
}
 
if(a.compareTo(b) == 1){
    System.out.println("a大于b");
}
 
if(a.compareTo(b) > -1){
    System.out.println("a大于等于b");
}
 
if(a.compareTo(b) < 1){
    System.out.println("a小于等于b");
}

  1.4 舍入模式

    1.4.1 ROUND_UP:

      舍入远离零的舍入模式。

      在丢弃非零部分之前始终增加数字(始终对非零舍弃部分前面的数字加1)。

      注意,此舍入模式始终不会减少计算值的大小。

BigDecimal a = new BigDecimal("1.33333");
BigDecimal b = new BigDecimal("-1.33333");
BigDecimal c= new BigDecimal("1.5555");
BigDecimal d = new BigDecimal("-1.5555");
System.out.println(a.setScale(2,BigDecimal.ROUND_UP)); //1.34
System.out.println(b.setScale(2,BigDecimal.ROUND_UP)); //-1.34
System.out.println(c.setScale(2,BigDecimal.ROUND_UP)); //1.56
System.out.println(d.setScale(2,BigDecimal.ROUND_UP)); //-1.56

   1.4.2 ROUND_DOWN:(个人常用)

    接近零的舍入模式。

    在丢弃某部分之前始终不增加数字(从不对舍弃部分前面的数字加1,即截短)。

    注意,此舍入模式始终不会增加计算值的大小。

System.out.println(a.setScale(2,BigDecimal.ROUND_DOWN)); //1.33
System.out.println(b.setScale(2,BigDecimal.ROUND_DOWN)); //-1.33
System.out.println(c.setScale(2,BigDecimal.ROUND_DOWN)); //1.55
System.out.println(d.setScale(2,BigDecimal.ROUND_DOWN)); //-1.55

    1.4.3 ROUND_CEILING:

    接近正无穷大的舍入模式。

    如果 BigDecimal 为正,则舍入行为与 ROUND_UP 相同;

    如果为负,则舍入行为与 ROUND_DOWN 相同。

    注意,此舍入模式始终不会减少计算值。

System.out.println(a.setScale(2,BigDecimal.ROUND_CEILING)); //1.34
System.out.println(b.setScale(2,BigDecimal.ROUND_CEILING)); //-1.33
System.out.println(c.setScale(2,BigDecimal.ROUND_CEILING)); //1.56
System.out.println(d.setScale(2,BigDecimal.ROUND_CEILING)); //-1.55

   1.4.4 ROUND_FLOOR:

    接近负无穷大的舍入模式。

    如果 BigDecimal 为正,则舍入行为与 ROUND_DOWN 相同;

    如果为负,则舍入行为与 ROUND_UP 相同。

    注意,此舍入模式始终不会增加计算值。

System.out.println(a.setScale(2,BigDecimal.ROUND_FLOOR)); //1.33
System.out.println(b.setScale(2,BigDecimal.ROUND_FLOOR)); //-1.34
System.out.println(c.setScale(2,BigDecimal.ROUND_FLOOR)); //1.55
System.out.println(d.setScale(2,BigDecimal.ROUND_FLOOR)); //-1.56

    1.4.5  ROUND_HALF_UP:

    向“最接近的”数字舍入,如果与两个相邻数字的距离相等,则为向上舍入的舍入模式。

    如果舍弃部分 >= 0.5,则舍入行为与 ROUND_UP 相同;否则舍入行为与 ROUND_DOWN 相同。

    注意,这是我们大多数人在小学时就学过的舍入模式(四舍五入)。

System.out.println(a.setScale(2,BigDecimal.ROUND_HALF_UP)); //1.33
System.out.println(b.setScale(2,BigDecimal.ROUND_HALF_UP)); //-1.33
System.out.println(c.setScale(2,BigDecimal.ROUND_HALF_UP)); //1.56
System.out.println(d.setScale(2,BigDecimal.ROUND_HALF_UP)); //-1.56

  1.4.6 ROUND_HALF_DOWN

    向“最接近的”数字舍入,如果与两个相邻数字的距离相等,则为上舍入的舍入模式。

    如果舍弃部分 > 0.5,则舍入行为与 ROUND_UP 相同;否则舍入行为与 ROUND_DOWN 相同(五舍六入)。

System.out.println(a.setScale(2,BigDecimal.ROUND_HALF_DOWN)); //1.33
System.out.println(b.setScale(2,BigDecimal.ROUND_HALF_DOWN)); //-1.33
System.out.println(c.setScale(1,BigDecimal.ROUND_HALF_DOWN)); //1.6
System.out.println(d.setScale(1,BigDecimal.ROUND_HALF_DOWN)); //-1.6
System.out.println(c.setScale(2,BigDecimal.ROUND_HALF_DOWN)); //1.56
System.out.println(d.setScale(2,BigDecimal.ROUND_HALF_DOWN)); //-1.56
System.out.println(c.setScale(3,BigDecimal.ROUND_HALF_DOWN)); //1.555
System.out.println(d.setScale(3,BigDecimal.ROUND_HALF_DOWN)); //-1.555

  1.4.7 ROUND_HALF_EVEN

    向“最接近的”数字舍入,如果与两个相邻数字的距离相等,则向相邻的偶数舍入。

    如果舍弃部分左边的数字为奇数,则舍入行为与 ROUND_HALF_UP 相同;

    如果为偶数,则舍入行为与 ROUND_HALF_DOWN 相同。

    注意,在重复进行一系列计算时,此舍入模式可以将累加错误减到最小。

    此舍入模式也称为“银行家舍入法”,主要在美国使用。四舍六入,五分两种情况。

    如果前一位为奇数,则入位,否则舍去。

    以下例子为保留小数点1位,那么这种舍入方式下的结果。

    1.15>1.2 1.25>1.2

BigDecimal a = new BigDecimal("1.15");
BigDecimal b = new BigDecimal("-1.15");
BigDecimal c= new BigDecimal("1.25");
BigDecimal d = new BigDecimal("-1.25");
System.out.println(a.setScale(1,BigDecimal.ROUND_HALF_EVEN)); //1.2
System.out.println(b.setScale(1,BigDecimal.ROUND_HALF_EVEN)); //-1.2
System.out.println(c.setScale(1,BigDecimal.ROUND_HALF_EVEN)); //1.2
System.out.println(d.setScale(1,BigDecimal.ROUND_HALF_EVEN)); //-1.2

  1.4.8 ROUND_UNNECESSARY   

    断言请求的操作具有精确的结果,因此不需要舍入。

    如果对获得精确结果的操作指定此舍入模式,则抛出ArithmeticException。

result = one.divide(three, 3,BigDecimal.ROUND_UNNECESSARY);//报错:Rounding necessary

 

mySql中的decimal    

  MySQL函数之cast()https://blog.csdn.net/weixin_43242942/article/details/86589188

实例:speical_profit_money 在数据库中定义的是一个decimal(10,2)数据类型,profitMoney 返回值定义的是BigDecimal  不加 0 + CAST(XXX  AS CHAR) 的时候会将整数补齐.00返回给前端。加上以后不会返回后面自动补齐的.00 (原理不清楚这个是百度到的。)

0 + CAST(IFNULL(pb.speical_profit_money,0) AS CHAR) AS "profitMoney"

 

posted @ 2021-04-28 10:20  小白菜白又青  阅读(860)  评论(0)    收藏  举报