BigDecimal⽤法及注意事项BigDecimal⽤法及注意事项
前⾔
查看compareTo源码发现并⽆异常处理机制,在使⽤CompareTo⽅法时⼀定要对⼊参进⾏判空处理异常处理⽐较⼤⼩:
if(apareTo(b)==-1){
System.out.println("a⼩于b");
}
if(apareTo(b)==0){
System.out.println("a等于b");
}
if(apareTo(b)==1){
System.out.println("a⼤于b");
}
if(apareTo(b)>-1){
System.out.println("a⼤于等于b");
}
if(apareTo(b)<1){
bigdecimal除法保留小数
System.out.println("a⼩于等于b");
}
基础运算:
//加减乘除:
BigDecimal a=new BigDecimal("10");
BigDecimal b=new BigDecimal("5");
/
/加法
a.add(b);
//减法
a.subtract(b);
//乘法
a.multiply(b);
//除法
a.divide(b);
setScale(2)// 表⽰保留两位⼩数,默认⽤四舍五⼊⽅式
setScale(2,BigDecimal.ROUND_DOWN)// 向下取整
setScale(2,BigDecimal.ROUND_UP)// 向上取整
setScale(2,BigDecimal.ROUND_HALF_UP)// 四舍五⼊
setScaler(2,BigDecimal.ROUND_HALF_DOWN)// 四舍五⼊,如果是5则向下舍
常见错误:
1、BigDecial的所有操作都会⽣成⼀个新的对象:
amount.add( thisAmount ); // 错误
amount = amount.add( thisAmount ); // 正确
2、不要⽤equals⽅法来⽐较BigDecimal对象,因为它的equals⽅法会⽐较scale,如果scale不⼀样,它会返回false;
例如:
BigDecimal a = new BigDecimal(“1.00”);
BigDecimal b = new BigDecimal(“1.0”);
print(a.equals(b)); // false
BigDecimal bigDecimal = new BigDecimal(“0.0”);
System.out.println(bigDecimal.equals(BigDecimal.ZERO));// false
3、如果直接使⽤a.divide(b)除法,有时会报除不尽异常,如下:
BigDecimal a = new BigDecimal(10);
BigDecimal b = new BigDecimal(3);
a = a.divide(b); // 错误会报如下异常:java.lang.ArithmeticException: Non-terminating
decimal expansion; no exact representable decimal result.
demo⼯具类案例:
package com.lyj.demo.utils;
import com.stant.Constants;
import com.stant.GlobalConstant;
import org.springframework.util.ObjectUtils;
import java.math.BigDecimal;
import java.util.Objects;
/**
* @author 凌兮
* @date 2020/7/28 11:17
* BigDecimal⼯具类
* setScale(scale, BigDecimal.ROUND_HALF_UP)
*
* setScale()⽅法⽤于格式化⼩数点
*
* scale 精度(保留⼏位⼩数)
*
* ROUND_HALF_UP 四舍五⼊
*
* 需要使⽤double,要注意:
*
* 1、请使⽤ BigDecimal.valueOf(amount) 进⾏转换,不能直接new BigDecimal(amount),这样会出现精度问题。
*
* 2、以double⼊参,以double精度为准。
*
*
setScale(2) // 表⽰保留两位⼩数,默认⽤四舍五⼊⽅式
setScale(2,BigDecimal.ROUND_DOWN) // 向下取整
setScale(2,BigDecimal.ROUND_UP)  // 向上取整
setScale(2,BigDecimal.ROUND_HALF_UP) // 四舍五⼊
setScaler(2,BigDecimal.ROUND_HALF_DOWN) // 四舍五⼊,如果是5则向下舍
*/
public final class BigDecimalUtil {
/**
* 四舍五⼊保留两位⼩数
*
* @param bigDecimal
* @return
*/
public static String scale2(BigDecimal bigDecimal){
return ObjectUtils.isEmpty(bigDecimal)? GlobalConstant.ZERO : bigDecimal.setScale(Constants.TWO, BigDecimal.ROUND_HALF_UP).toString(); }
/**
* 原样输出不采⽤默认的toString以科学计数法输出
* 原样输出不采⽤默认的toString以科学计数法输出
*
* @param bigDecimal
* @return 币值字符串
*/
public static String toString(BigDecimal bigDecimal){
return ObjectUtils.isEmpty(bigDecimal)? GlobalConstant.ZERO : PlainString();
}
/**
* 两数相加
*
* @param value1
* @param value2
* @return
*/
public static BigDecimal add(BigDecimal value1, BigDecimal value2){
return value1.add(value2);
}
/**
* 分转元(除以100)(⽀持⼤数16位以上)保留两位⼩数
*
* @param amount 分⾦额
* @return 元⾦额
*/
public static String changeF2Y(String amount){
return new BigDecimal(amount).divide(new BigDecimal("100")).setScale(2, BigDecimal.ROUND_HALF_UP).toString(); }
/**
* 元转分(乘以100)(⽀持⼤数16位以上)
*
* @param amount 元⾦额
* @return 分⾦额
*/
public static String changeY2F(String amount){
return new BigDecimal(amount).multiply(new BigDecimal("100")).toString();
}
/** ---------------------compareTo源码发现并⽆异常处理机制,所以a,b都不可为空,异常需提前处理-------------*/
/**
* amount 是否等于0
*
* @param amount ⾦额
* @return 0:等于0,-1:⼩于0,1:⼤于0
*/
public static int equalToZero(BigDecimal amount){
// 判空并抛异常信息
return amountpareTo(BigDecimal.ZERO);
}
/**
* A与B的⼤⼩⽐较
*
* @param a ⾦额A
* @param b ⾦额B
* @return 0:相等,-1:a<b,1:a>b
*/
public static int aCompareToB(BigDecimal a, BigDecimal b){
return apareTo(b);
}
/**
* double类型
* @param amount
* @return
*/
*/
public static String changeF2Y(double amount){
return BigDecimal.valueOf(amount).divide(new BigDecimal(100)).setScale(2, BigDecimal.ROUND_HALF_UP).toString(); }
/**
* 货币测试
* @param args
*/
public static void main(String[] args){
//普通数值
System.out.println(changeF2Y("101"));
//1.01
System.out.println(changeY2F("101"));
//10100
System.out.println(changeF2Y(23.45));
// 0.23
//超16位以上数值
System.out.println(changeF2Y("34353452345768679845234534343445"));
//343534523457686798452345343434.45
System.out.println(changeY2F("32123134757697845454423534232323"));
//3212313475769784545442353423232300
}
}

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。