package com.by4cloud.platformx.business.invoice.utils;
|
|
import java.math.BigDecimal;
|
import java.math.RoundingMode;
|
|
/**
|
* @author xfei
|
* @date 2022/5/27下午8:26
|
*/
|
public class NumUtils {
|
/**
|
* 精确小数
|
* @param f 小数
|
* @param length 精确位数
|
* @return
|
*/
|
public static Float accurateFloat(Float f,int length){
|
BigDecimal b = new BigDecimal(f.toString());
|
f = b.setScale(length,BigDecimal.ROUND_HALF_UP).floatValue();
|
return f;
|
}
|
public static Float accurateFloat(Float f){
|
return accurateFloat(f,3);
|
}
|
|
public static Double accurateFloat(Double f,int length){
|
BigDecimal b = new BigDecimal(f.toString());
|
f = b.setScale(length,BigDecimal.ROUND_HALF_UP).doubleValue();
|
return f;
|
}
|
public static Double accurateFloat(Double f){
|
return accurateFloat(f,3);
|
}
|
|
|
public static Double accurateDouble(Double f,int length){
|
if(f==null){
|
f=0d;
|
}
|
BigDecimal b2 = new BigDecimal(f.toString());
|
f = b2.setScale(length,BigDecimal.ROUND_HALF_UP).doubleValue();
|
return f;
|
}
|
public static Double accurateDouble(Double f){
|
return accurateDouble(f,3);
|
}
|
|
/**
|
* 加
|
* @param a
|
* @param b
|
* @return
|
*/
|
public static Double addDouble(Double a,Double b){
|
if (a==null)a=0d;
|
if (b==null)b=0d;
|
BigDecimal aa = new BigDecimal(a+"");
|
BigDecimal bb = new BigDecimal(b+"");
|
aa = aa.add(bb);
|
aa = aa.setScale(2,BigDecimal.ROUND_HALF_UP);
|
return aa.doubleValue();
|
}
|
public static Double addDoubles(Double ... a){
|
Double result = 0d;
|
for (Double d :a){
|
result =addDouble(result,d);
|
}
|
return result;
|
}
|
|
public static Double addDoubles(int len,Double ... a){
|
Double result = 0d;
|
for (Double d :a){
|
result =addDouble(result,d,len);
|
}
|
return result;
|
}
|
|
/**
|
* 减
|
* @param a
|
* @param b
|
* @return
|
*/
|
public static Double subtractDouble(Double a,Double b){
|
if (a==null)a=0d;
|
if (b==null)b=0d;
|
BigDecimal aa = new BigDecimal(a+"");
|
BigDecimal bb = new BigDecimal(b+"");
|
aa = aa.subtract(bb);
|
aa = aa.setScale(2,BigDecimal.ROUND_HALF_UP);
|
return aa.doubleValue();
|
}
|
|
/**
|
* 减 只舍不入
|
* @param a
|
* @param b
|
* @return
|
*/
|
public static Double subtractDoubleDown(Double a,Double b){
|
if (a==null)a=0d;
|
if (b==null)b=0d;
|
BigDecimal aa = new BigDecimal(a+"");
|
BigDecimal bb = new BigDecimal(b+"");
|
aa = aa.subtract(bb);
|
aa = aa.setScale(2,BigDecimal.ROUND_DOWN);
|
return aa.doubleValue();
|
}
|
|
/**
|
* 乘
|
* @param a
|
* @param b
|
* @return
|
*/
|
public static Double multiplyDouble(Double a,Double b){
|
if (a==null)a=0d;
|
if (b==null)b=0d;
|
BigDecimal aa = new BigDecimal(a+"");
|
BigDecimal bb = new BigDecimal(b+"");
|
aa = aa.multiply(bb);
|
aa = aa.setScale(2,BigDecimal.ROUND_HALF_UP);
|
return aa.doubleValue();
|
}
|
/**
|
* 乘 只舍不入
|
* @param a
|
* @param b
|
* @return
|
*/
|
public static Double multiplyDoubleDown(Double a,Double b){
|
if (a==null)a=0d;
|
if (b==null)b=0d;
|
BigDecimal aa = new BigDecimal(a+"");
|
BigDecimal bb = new BigDecimal(b+"");
|
aa = aa.multiply(bb);
|
aa = aa.setScale(2,BigDecimal.ROUND_DOWN);
|
return aa.doubleValue();
|
}
|
/**
|
* 安全的除法运算,处理 null 和除以零,并返回保留两位小数的结果。
|
*
|
* @param a 被除数
|
* @param b 除数
|
* @return (a / b) 的结果,保留两位小数。如果 b 为 0 或 null,则返回 0.0。
|
*/
|
public static Double divideDouble(Double a, Double b) {
|
// 使用 Double.valueOf(0d) 来避免自动装箱带来的潜在问题,虽然这里 0d 是字面量
|
Double dividend = a==null? 0.0:a;
|
Double divisor = b==null? 0.0:b;
|
|
// 处理除以零的情况
|
if (divisor.equals(0.0)) {
|
// 可以根据业务逻辑选择返回 0.0、null 或抛出 IllegalArgumentException
|
return 0.0;
|
}
|
|
// 使用 String.valueOf 或 toString() 来避免 double 构造器的精度问题
|
BigDecimal bdDividend = new BigDecimal(dividend.toString());
|
BigDecimal bdDivisor = new BigDecimal(divisor.toString());
|
|
// 在除法的同时指定精度和舍入模式
|
BigDecimal result = bdDividend.divide(bdDivisor, 2, RoundingMode.HALF_UP);
|
|
return result.doubleValue();
|
}
|
// /**
|
// * 除
|
// * 除法
|
// * @param a
|
// * @param b
|
// * @return
|
// */
|
// public static Double divideDouble(Double a,Double b){
|
// if (a==null)a=0d;
|
// if (b==null)b=0d;
|
// BigDecimal aa = new BigDecimal(a+"");
|
// BigDecimal bb = new BigDecimal(b+"");
|
// aa = aa.divide(bb);
|
// aa = aa.setScale(2,BigDecimal.ROUND_HALF_UP);
|
// return aa.doubleValue();
|
// }
|
|
public static Double divideDoubleUp(Double a,Double b){
|
if (a==null)a=0d;
|
if (b==null)b=0d;
|
BigDecimal aa = new BigDecimal(a+"");
|
BigDecimal bb = new BigDecimal(b+"");
|
aa = aa.divide(bb,BigDecimal.ROUND_HALF_UP);
|
aa = aa.setScale(2,BigDecimal.ROUND_HALF_UP);
|
return aa.doubleValue();
|
}
|
|
/**
|
* 除
|
* 除法
|
* @param a
|
* @param b
|
* @return
|
*/
|
public static Double divideDoubleDown(Double a,Double b){
|
if (a==null)a=0d;
|
if (b==null)b=0d;
|
BigDecimal aa = new BigDecimal(a+"");
|
BigDecimal bb = new BigDecimal(b+"");
|
aa = aa.divide(bb);
|
aa = aa.setScale(2,BigDecimal.ROUND_DOWN);
|
return aa.doubleValue();
|
}
|
/**
|
* 加
|
* @param a
|
* @param b
|
* @return
|
*/
|
public static Double addDouble(Double a,Double b,int len){
|
if (a==null)a=0d;
|
if (b==null)b=0d;
|
BigDecimal aa = new BigDecimal(a+"");
|
BigDecimal bb = new BigDecimal(b+"");
|
aa = aa.add(bb);
|
aa = aa.setScale(len,BigDecimal.ROUND_HALF_UP);
|
return aa.doubleValue();
|
}
|
|
/**
|
* 减
|
* @param a
|
* @param b
|
* @return
|
*/
|
public static Double subtractDouble(Double a,Double b,int len){
|
if (a==null)a=0d;
|
if (b==null)b=0d;
|
BigDecimal aa = new BigDecimal(a+"");
|
BigDecimal bb = new BigDecimal(b+"");
|
aa = aa.subtract(bb);
|
aa = aa.setScale(len,BigDecimal.ROUND_HALF_UP);
|
return aa.doubleValue();
|
}
|
|
/**
|
* 乘
|
* @param a
|
* @param b
|
* @return
|
*/
|
public static Double multiplyDouble(Double a,Double b,int len){
|
if (a==null)a=0d;
|
if (b==null)b=0d;
|
BigDecimal aa = new BigDecimal(a+"");
|
BigDecimal bb = new BigDecimal(b+"");
|
aa = aa.multiply(bb);
|
aa = aa.setScale(len,BigDecimal.ROUND_HALF_UP);
|
return aa.doubleValue();
|
}
|
/**
|
* 除
|
* @param a
|
* @param b
|
* @return
|
*/
|
public static Double divideDouble(Double a,Double b,int len){
|
if (a==null)a=0d;
|
if (b==null)b=0d;
|
if(b==0){
|
return 0.0d;
|
}
|
BigDecimal aa = new BigDecimal(a+"");
|
BigDecimal bb = new BigDecimal(b+"");
|
aa = aa.divide(bb,len, BigDecimal.ROUND_HALF_UP);
|
return aa.doubleValue();
|
}
|
|
|
|
public static Double floatToD(Float f){
|
if (f == null) {
|
return new Double(0);
|
}
|
return new Double(f);
|
}
|
|
public static void main(String[] args) {
|
// System.out.println(NumUtils.accurateDouble(60.1575,3));
|
System.out.println(NumUtils.addDoubles(6.1234d, 6.1234d, 4.33d));
|
}
|
|
/**
|
* 只舍不入计算方法
|
*
|
* @param number
|
* @param decimalPlaces
|
* @return
|
*/
|
public static double truncateToDecimalPlaces(double number, int decimalPlaces) {
|
if (decimalPlaces < 0) {
|
throw new IllegalArgumentException("小数位数不能为负数");
|
}
|
double multiplier = Math.pow(10, decimalPlaces);
|
return (double) ((long) (number * multiplier)) / multiplier;
|
}
|
|
}
|