本文共 5177 字,大约阅读时间需要 17 分钟。
数据库字段定义如下:
`balance` DECIMAL(18, 2) NOT NULL DEFAULT '0.00' COMMENT '账户余额'
`total_amount` bigint(20) NOT NULL DEFAULT '0' COMMENT '总金额(单位: 分)',
/** * 判断输入的值value的小数点数 * @param value * @return */ public static int getDoublePrecision(BigDecimal bigDecimal) { String valueStr = bigDecimal.toString(); int indexOf = valueStr.indexOf("."); if (indexOf > 0) { doublePrecision = valueStr.length() - 1 -indexOf; } return doublePrecision; }
BigDecimal bigDecimal1 = new BigDecimal(a);log.info("bigDecimal1 is:{}", bigDecimal1); // 输出:bigDecimal1 is:1.1100000000000000976996261670137755572795867919921875// 即用BigDecimal中String来接收BigDecimal bigDecimal2 = new BigDecimal(Double.toString(a)); // 推荐BigDecimal bigDecimal3 = new BigDecimal(a.toString());log.info("bigDecimal2 is:{}, bigDecimal3 is:{}", bigDecimal2, bigDecimal3);/** * 加减乘除 demo */// 加法BigDecimal add1 = new BigDecimal("1.22");BigDecimal add2 = new BigDecimal("2.33");BigDecimal bigDecimalAdd = add1.add(add2);Double valueAdd = bigDecimalAdd.doubleValue();log.info("BigDecimal add is:{}", valueAdd);// 减法BigDecimal sub1 = new BigDecimal("4.55");BigDecimal sub2 = new BigDecimal("2.13");BigDecimal bigDecimalSub = sub1.subtract(sub2);Double valueSub = bigDecimalSub.doubleValue();log.info("BigDecimal sub is:{}", bigDecimalSub);// 乘法BigDecimal mul1 = new BigDecimal("1.33");BigDecimal mul2 = new BigDecimal("6.41");BigDecimal bigDecimalMul = mul1.multiply(mul2);Double valueMul = bigDecimalMul.doubleValue();log.info("BigDecimal multiply is:{}", valueMul);// 除法int scale = 2; // 保留两位小数BigDecimal div1 = new BigDecimal("3.34");BigDecimal div2 = new BigDecimal("1.37");BigDecimal bigDecimalDiv = div1.divide(div2, scale, BigDecimal.ROUND_HALF_UP); // 四舍五入Double valueDiv = bigDecimalDiv.doubleValue();log.info("BigDecimal divide is:{}", bigDecimalDiv.doubleValue());
@Datapublic class ValidParameterVo { @BigDecimalMaxPrecision(value = 2, message = "输入金额的最大精度不能超过小数点2位") private BigDecimal money;}
{ "data": { "errorCode": 1, "message": "输入金额的最大精度不能超过小数点2位" }, "status": 1}
import javax.validation.Constraint;import javax.validation.Payload;import java.lang.annotation.Documented;import java.lang.annotation.Retention;import java.lang.annotation.Target;import static java.lang.annotation.ElementType.ANNOTATION_TYPE;import static java.lang.annotation.ElementType.CONSTRUCTOR;import static java.lang.annotation.ElementType.FIELD;import static java.lang.annotation.ElementType.METHOD;import static java.lang.annotation.ElementType.PARAMETER;import static java.lang.annotation.RetentionPolicy.RUNTIME;@Target({METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER})@Retention(RUNTIME)@Constraint(validatedBy = {BigDecimalMaxPrecisionValidator.class})@Documentedpublic @interface BigDecimalMaxPrecision { int value() default 2; String message() default "{com.sankuai.meituan.donation.common.validate.BigDecimalPrecision.message}"; Class [] groups() default { }; Class [] payload() default { }; @Target({METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER}) @Retention(RUNTIME) @Documented @interface List { BigDecimalMaxPrecision[] value(); }}
import lombok.extern.slf4j.Slf4j;import javax.validation.ConstraintValidator;import javax.validation.ConstraintValidatorContext;import java.math.BigDecimal;@Slf4jpublic class BigDecimalMaxPrecisionValidator implements ConstraintValidator{ private int value; private String message; @Override public void initialize(BigDecimalMaxPrecision constraintAnnotation) { this.value = constraintAnnotation.value(); this.message = constraintAnnotation.message(); } @Override public boolean isValid(BigDecimal bigDecimal, ConstraintValidatorContext context) { if (bigDecimal == null) { return true; } String bigDecimalStr = bigDecimal.toString(); int indexOf = bigDecimalStr.indexOf("."); int doublePrecision; if (indexOf > 0) { doublePrecision = bigDecimalStr.length() - 1 -indexOf; if (doublePrecision > value) { log.warn("input bigDecimal value is:{}, precision is:{}, set max precision is:{}", bigDecimal, doublePrecision, value); return false; } } return true; }}
转载地址:http://rgomi.baihongyu.com/