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; } }