遇到的坑
- DecimalFormat 默认是 RoundingMode.ROUND_HALF_EVEN
public static Double formatRoundUp(double v, int point) {
NumberFormat nf = NumberFormat.getInstance();
nf.setRoundingMode(RoundingMode.HALF_UP);
nf.setMinimumFractionDigits(point);
nf.setMaximumFractionDigits(point);
return Double.valueOf(nf.format(v));
}
- new BigDecimal(12.345f) 创建对象时精度丢失,转换成字符串创建BigDecimal
BigDecimal n2 = new BigDecimal(Float.toString(v));
BigDecimal b = new BigDecimal(Double.toString(v));
工具类 BigDecimalUtils.java
package com.hx.ser.ier.utils;
import feign.Retryer;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.text.DecimalFormat;
import java.text.NumberFormat;
public class BigDecimalUtils {
public static final int MONEY_POINT = 2;
public static Double format(double v, int point) {
BigDecimal b = new BigDecimal(Double.toString(v));
return b.setScale(point, BigDecimal.ROUND_HALF_UP).doubleValue();
}
public static Double formatRoundUp(double v, int point) {
NumberFormat nf = NumberFormat.getInstance();
nf.setRoundingMode(RoundingMode.HALF_UP);
nf.setMinimumFractionDigits(point);
nf.setMaximumFractionDigits(point);
return Double.valueOf(nf.format(v));
}
public static String moneyFormat(Double v) {
DecimalFormat formater = new DecimalFormat();
formater.setMaximumFractionDigits(2);
formater.setGroupingSize(3);
formater.setRoundingMode(RoundingMode.FLOOR);
return formater.format(v.doubleValue());
}
public static String doubleTrans(Double d) {
if (Math.round(d) - d == 0) {
return String.valueOf((long) d.doubleValue());
}
return String.valueOf(d);
}
public static Double add(double v1, double v2) {
BigDecimal n1 = new BigDecimal(Double.toString(v1));
BigDecimal n2 = new BigDecimal(Double.toString(v2));
return n1.add(n2).doubleValue();
}
public static Float add(Float ...v1) {
BigDecimal n1 = new BigDecimal("0");
for (Float v:v1){
if (v == null ){
v=0f;
}
BigDecimal n2 = new BigDecimal(Float.toString(v));
n1 = n1.add(n2);
}
return n1.floatValue();
}
public static Double subtract(double v1, double v2) {
BigDecimal n1 = new BigDecimal(Double.toString(v1));
BigDecimal n2 = new BigDecimal(Double.toString(v2));
return n1.subtract(n2).doubleValue();
}
public static Float subtract(Float v1, Float v2) {
if (v1 == null ){
v1=0f;
}
if (v2 == null ){
v2=0f;
}
BigDecimal n1 = new BigDecimal(Float.toString(v1));
BigDecimal n2 = new BigDecimal(Float.toString(v2));
return n1.subtract(n2).floatValue();
}
public static Double multiply(double v1, double v2) {
BigDecimal n1 = new BigDecimal(Double.toString(v1));
BigDecimal n2 = new BigDecimal(Double.toString(v2));
return n1.multiply(n2).doubleValue();
}
public static Float multiply(Float v1, Float v2) {
if (v1 == null ){
v1=0f;
}
if (v2 == null ){
v2=0f;
}
BigDecimal n1 = new BigDecimal(Float.toString(v1));
BigDecimal n2 = new BigDecimal(Float.toString(v2));
return n1.multiply(n2).floatValue();
}
public static Double divide(double v1, double v2) {
BigDecimal n1 = new BigDecimal(Double.toString(v1));
BigDecimal n2 = new BigDecimal(Double.toString(v2));
return n1.divide(n2, 10, BigDecimal.ROUND_HALF_UP).doubleValue();
}
public static Float divide(Float v1, Float v2,int scale) {
if (v1 == null ){
v1=0f;
}
if (v2 == null ){
v2=0f;
}
BigDecimal n1 = new BigDecimal(Float.toString(v1));
BigDecimal n2 = new BigDecimal(Float.toString(v2));
return n1.divide(n2, scale, BigDecimal.ROUND_HALF_UP).floatValue();
}
public static int compare(double v1, double v2) {
BigDecimal n1 = new BigDecimal(Double.toString(v1));
BigDecimal n2 = new BigDecimal(Double.toString(v2));
return n1.compareTo(n2);
}
public static String precision(float value){
DecimalFormat decimalFormat = new DecimalFormat("0.00");
decimalFormat.setRoundingMode(RoundingMode.HALF_UP);
String re = decimalFormat.format(value);
return "".equals(re)? "0" : re;
}
public String precision (String value){
if (value == null || "".equals(value)){
return "0";
}
try {
Float v = Float.parseFloat(value);
return precision(v);
} catch (NumberFormatException e) {
return "0";
}
}
public static void main(String[] args) {
System.out.println(doubleTrans(10000.0));
}
}