首页 > 其他分享 >Bigdecimal使用

Bigdecimal使用

时间:2023-05-15 09:46:43浏览次数:38  
标签:scale Bigdecimal param v1 v2 使用 new BigDecimal

1.Bigdecimal返回数据小数后0自动被删除的问题

import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.SerializerProvider;

import java.io.IOException;
import java.math.BigDecimal;
import java.math.RoundingMode;


public class BigDecimalSerialize  extends JsonSerializer<BigDecimal> {

    @Override
    public void serialize(BigDecimal bigDecimal, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException {
        if (null != bigDecimal) {
            jsonGenerator.writeString(bigDecimal.setScale(BigDecimal.ROUND_CEILING, RoundingMode.HALF_DOWN).toPlainString() );
        } else {
            jsonGenerator.writeString(BigDecimal.ZERO.toPlainString());
        }
    }
}

在需要处理的字段上使用

@JsonSerialize(using = BigDecimalSerialize.class)
    private BigDecimal amount;

2.BigDecimal格式化保留2为小数,不足则补0

public class NumberFormat {

    public static void main(String[] s){
        System.out.println(formatToNumber(new BigDecimal("3.435")));
        System.out.println(formatToNumber(new BigDecimal(0)));
        System.out.println(formatToNumber(new BigDecimal("0.00")));
        System.out.println(formatToNumber(new BigDecimal("0.001")));
        System.out.println(formatToNumber(new BigDecimal("0.006")));
        System.out.println(formatToNumber(new BigDecimal("0.206")));
    }
    /**
     * @desc 1.0~1之间的BigDecimal小数,格式化后失去前面的0,则前面直接加上0。
     * 2.传入的参数等于0,则直接返回字符串"0.00"
     * 3.大于1的小数,直接格式化返回字符串
     * @param obj传入的小数
     * @return
     */
    public static String formatToNumber(BigDecimal obj) {
        DecimalFormat df = new DecimalFormat("#.00");
        if(obj.compareTo(BigDecimal.ZERO)==0) {
            return "0.00";
        }else if(obj.compareTo(BigDecimal.ZERO)>0&&obj.compareTo(new BigDecimal(1))<0){
            return "0"+df.format(obj).toString();
        }else {
            return df.format(obj).toString();
        }
    }
}

3.Bigdecimal通用工具类

import java.math.BigDecimal;

/**
 * 用于高精确处理常用的数学运算
 */
public class ArithmeticUtils {
    //默认除法运算精度
    private static final int DEF_DIV_SCALE = 10;

    private static final String TEN_THOUSAND_UNIT = "万";
    private static final String HUNDRED_MILLION_UNIT = "亿";

    private static final BigDecimal TEN_HUNDRED_THOUSAND = new BigDecimal(10000);
    private static final BigDecimal ONE_HUNDRED_MILLION = new BigDecimal(100000000);
    private static final BigDecimal TEN_THOUSAND = new BigDecimal(10000);

    /**
     * 提供精确的加法运算
     *
     * @param v1 被加数
     * @param v2 加数
     * @return 两个参数的和
     */

    public static double add(double v1, double v2) {
        BigDecimal b1 = new BigDecimal(Double.toString(v1));
        BigDecimal b2 = new BigDecimal(Double.toString(v2));
        return b1.add(b2).doubleValue();
    }

    /**
     * 提供精确的加法运算
     *
     * @param v1 被加数
     * @param v2 加数
     * @return 两个参数的和
     */
    public static BigDecimal add(String v1, String v2) {
        BigDecimal b1 = new BigDecimal(v1);
        BigDecimal b2 = new BigDecimal(v2);
        return b1.add(b2);
    }

    /**
     * 提供精确的加法运算
     *
     * @param v1    被加数
     * @param v2    加数
     * @param scale 保留scale 位小数
     * @return 两个参数的和
     */
    public static String add(String v1, String v2, int scale) {
        if (scale < 0) {
            throw new IllegalArgumentException(
                    "The scale must be a positive integer or zero");
        }
        BigDecimal b1 = new BigDecimal(v1);
        BigDecimal b2 = new BigDecimal(v2);
        return b1.add(b2).setScale(scale, BigDecimal.ROUND_HALF_UP).toString();
    }

    /**
     * 提供精确的减法运算
     *
     * @param v1 被减数
     * @param v2 减数
     * @return 两个参数的差
     */
    public static double sub(double v1, double v2) {
        BigDecimal b1 = new BigDecimal(Double.toString(v1));
        BigDecimal b2 = new BigDecimal(Double.toString(v2));
        return b1.subtract(b2).doubleValue();
    }

    /**
     * 提供精确的减法运算。
     *
     * @param v1 被减数
     * @param v2 减数
     * @return 两个参数的差
     */
    public static BigDecimal sub(String v1, String v2) {
        BigDecimal b1 = new BigDecimal(v1);
        BigDecimal b2 = new BigDecimal(v2);
        return b1.subtract(b2);
    }

    /**
     * 提供精确的减法运算
     *
     * @param v1    被减数
     * @param v2    减数
     * @param scale 保留scale 位小数
     * @return 两个参数的差
     */
    public static String sub(String v1, String v2, int scale) {
        if (scale < 0) {
            throw new IllegalArgumentException(
                    "The scale must be a positive integer or zero");
        }
        BigDecimal b1 = new BigDecimal(v1);
        BigDecimal b2 = new BigDecimal(v2);
        return b1.subtract(b2).setScale(scale, BigDecimal.ROUND_HALF_UP).toString();
    }

    /**
     * 提供精确的乘法运算
     *
     * @param v1 被乘数
     * @param v2 乘数
     * @return 两个参数的积
     */
    public static double mul(double v1, double v2) {
        BigDecimal b1 = new BigDecimal(Double.toString(v1));
        BigDecimal b2 = new BigDecimal(Double.toString(v2));
        return b1.multiply(b2).doubleValue();
    }

    /**
     * 提供精确的乘法运算
     *
     * @param v1 被乘数
     * @param v2 乘数
     * @return 两个参数的积
     */
    public static BigDecimal mul(String v1, String v2) {
        BigDecimal b1 = new BigDecimal(v1);
        BigDecimal b2 = new BigDecimal(v2);
        return b1.multiply(b2);
    }

    /**
     * 提供精确的乘法运算
     *
     * @param v1    被乘数
     * @param v2    乘数
     * @param scale 保留scale 位小数
     * @return 两个参数的积
     */
    public static double mul(double v1, double v2, int scale) {
        BigDecimal b1 = new BigDecimal(Double.toString(v1));
        BigDecimal b2 = new BigDecimal(Double.toString(v2));
        return round(b1.multiply(b2).doubleValue(), scale);
    }

    /**
     * 提供精确的乘法运算
     *
     * @param v1    被乘数
     * @param v2    乘数
     * @param scale 保留scale 位小数
     * @return 两个参数的积
     */
    public static String mul(String v1, String v2, int scale) {
        if (scale < 0) {
            throw new IllegalArgumentException(
                    "The scale must be a positive integer or zero");
        }
        BigDecimal b1 = new BigDecimal(v1);
        BigDecimal b2 = new BigDecimal(v2);
        return b1.multiply(b2).setScale(scale, BigDecimal.ROUND_HALF_UP).toString();
    }

    /**
     * 提供(相对)精确的除法运算,当发生除不尽的情况时,精确到
     * 小数点以后10位,以后的数字四舍五入
     *
     * @param v1 被除数
     * @param v2 除数
     * @return 两个参数的商
     */

    public static double div(double v1, double v2) {
        return div(v1, v2, DEF_DIV_SCALE);
    }

    /**
     * 提供(相对)精确的除法运算。当发生除不尽的情况时,由scale参数指
     * 定精度,以后的数字四舍五入
     *
     * @param v1    被除数
     * @param v2    除数
     * @param scale 表示表示需要精确到小数点以后几位。
     * @return 两个参数的商
     */
    public static double div(double v1, double v2, int scale) {
        if (scale < 0) {
            throw new IllegalArgumentException("The scale must be a positive integer or zero");
        }
        BigDecimal b1 = new BigDecimal(Double.toString(v1));
        BigDecimal b2 = new BigDecimal(Double.toString(v2));
        return b1.divide(b2, scale, BigDecimal.ROUND_HALF_UP).doubleValue();
    }

    /**
     * 提供(相对)精确的除法运算。当发生除不尽的情况时,由scale参数指
     * 定精度,以后的数字四舍五入
     *
     * @param v1    被除数
     * @param v2    除数
     * @param scale 表示需要精确到小数点以后几位
     * @return 两个参数的商
     */
    public static String div(String v1, String v2, int scale) {
        if (scale < 0) {
            throw new IllegalArgumentException("The scale must be a positive integer or zero");
        }
        BigDecimal b1 = new BigDecimal(v1);
        BigDecimal b2 = new BigDecimal(v1);
        return b1.divide(b2, scale, BigDecimal.ROUND_HALF_UP).toString();
    }

    /**
     * 提供精确的小数位四舍五入处理
     *
     * @param v     需要四舍五入的数字
     * @param scale 小数点后保留几位
     * @return 四舍五入后的结果
     */
    public static double round(double v, int scale) {
        if (scale < 0) {
            throw new IllegalArgumentException("The scale must be a positive integer or zero");
        }
        BigDecimal b = new BigDecimal(Double.toString(v));
        return b.setScale(scale, BigDecimal.ROUND_HALF_UP).doubleValue();
    }

    /**
     * 提供精确的小数位四舍五入处理
     *
     * @param v     需要四舍五入的数字
     * @param scale 小数点后保留几位
     * @return 四舍五入后的结果
     */
    public static String round(String v, int scale) {
        if (scale < 0) {
            throw new IllegalArgumentException(
                    "The scale must be a positive integer or zero");
        }
        BigDecimal b = new BigDecimal(v);
        return b.setScale(scale, BigDecimal.ROUND_HALF_UP).toString();
    }

    /**
     * 取余数
     *
     * @param v1    被除数
     * @param v2    除数
     * @param scale 小数点后保留几位
     * @return 余数
     */
    public static String remainder(String v1, String v2, int scale) {
        if (scale < 0) {
            throw new IllegalArgumentException(
                    "The scale must be a positive integer or zero");
        }
        BigDecimal b1 = new BigDecimal(v1);
        BigDecimal b2 = new BigDecimal(v2);
        return b1.remainder(b2).setScale(scale, BigDecimal.ROUND_HALF_UP).toString();
    }

    /**
     * 取余数  BigDecimal
     *
     * @param v1    被除数
     * @param v2    除数
     * @param scale 小数点后保留几位
     * @return 余数
     */
    public static BigDecimal remainder(BigDecimal v1, BigDecimal v2, int scale) {
        if (scale < 0) {
            throw new IllegalArgumentException(
                    "The scale must be a positive integer or zero");
        }
        return v1.remainder(v2).setScale(scale, BigDecimal.ROUND_HALF_UP);
    }

    /**
     * 比较大小
     *
     * @param v1 被比较数
     * @param v2 比较数
     * @return 如果v1 大于v2 则 返回true 否则false
     */
    public static boolean compare(String v1, String v2) {
        BigDecimal b1 = new BigDecimal(v1);
        BigDecimal b2 = new BigDecimal(v2);
        int bj = b1.compareTo(b2);
        boolean res;
        if (bj > 0)
            res = true;
        else
            res = false;
        return res;
    }

    /**
     * 过万/亿自动转换单位 返回格式 数值_单位
     * @param var 待转换参数
     * @param scale 保留位数
     * @return 带单位的数字字符串
     */
    public static String amountConversion(String var, boolean isTenThousand, @Nullable Integer scale) {
        // 参数校验
        Assert.notNull(var, "The var cannot be empty");
        Pattern pattern = Pattern.compile("(^[+-]?[0-9]+)|(^[+-]?[0-9]+\\.[0-9]+)");
        if (!pattern.matcher(var).matches()) {
            throw new IllegalArgumentException("var must be number");
        }

        BigDecimal amount = new BigDecimal(var);
        if (scale == null) {
            scale = CommonConstant.FOUR_SCALE;
        }

        if (amount.abs().compareTo(TEN_HUNDRED_THOUSAND) < 0) {
            //如果小于1万
            return amount.stripTrailingZeros().setScale(scale, RoundingMode.HALF_UP).toPlainString() + "_" + (isTenThousand ? TEN_THOUSAND_UNIT : "");
        }
        if (amount.abs().compareTo(ONE_HUNDRED_MILLION) < 0) {
            //如果大于1万小于1亿
            return amount.divide(TEN_THOUSAND, scale, RoundingMode.HALF_UP).stripTrailingZeros().toPlainString() + "_" + (isTenThousand ? HUNDRED_MILLION_UNIT : TEN_THOUSAND_UNIT);
        }
        return amount.divide(ONE_HUNDRED_MILLION, scale, RoundingMode.HALF_UP).stripTrailingZeros().toPlainString() + "_" + (isTenThousand ? TEN_THOUSAND_UNIT + HUNDRED_MILLION_UNIT : HUNDRED_MILLION_UNIT);
    }
}

标签:scale,Bigdecimal,param,v1,v2,使用,new,BigDecimal
From: https://www.cnblogs.com/xiaojianwen/p/17400816.html

相关文章

  • 使用dapper命令参数动态拼接出最安全的sql语句
    多条件查询--使用dapper命令参数动态拼接出最安全的sql语句publicList<MSys_Admin>GetAdminList(MSys_Adminmodel){stringsqlText="selectcount(1)fromSys_Adminwhere1=1";varp=newDynamicParameters();if(!string.IsNullOrEmpty(model.LoginName)){sqlText+=&qu......
  • uni-app图片剪切上传;uview2用使用uview1中的图片剪切上传组件,把原有代码抽取出来
    1.其实是个组件页面,移过来就行了。2.原有组件中,可视区域和截图结果区域的长宽是一样的,所以需要调整一下;3.因为剪切图片,是在一个单独页面实现的.所以pages.json中需要加上剪切的页面路径;pages.json{ "path":"components/u-avatar-cropper/u-avatar-cropp......
  • 百度飞桨(PaddlePaddle) - PaddleOCR 文字识别简单使用
    百度飞桨(PaddlePaddle)安装OCR文字检测(DifferentiableBinarization---DB)OCR的技术路线PaddleHub预训练模型的网络结构是DB+CRNN,可微的二值化模块(DifferentiableBinarization,简称DB)CRNN(ConvolutionalRecurrentNeuralNetwork)即卷积递归神经网络,是DCNN和RNN的......
  • 使用chrome console检查css selector/xpath的有效性|百度云盘如何获取文件库中的目录
    定位元素时,一般用xpath或cssselector来定位,定位时可以借助chrome浏览器或firefox浏览器的firebug来直接copyselector或copyxpath。此文介绍使用chrome怎样去验证cssselector或xpath的有效性。步骤 1.按F12打开chrome的开发者工具; 2.再按Esc键调出console 经过这俩步骤,c......
  • 写一篇关于时区转换的 astimezome 的使用
    Python内置的datetime模块真的很烂,默认的所有时间出来都是不带时区的,所以一般在时间的处理上面,我一般用三方的arrow但由于每次配置环境都要装arrow有时候很不方便,就想着尝试使用datetime,想不到一用就掉坑了。 在一次装换为美东时间的代码中,我尝试如下运行d=dateti......
  • telnet命令无法使用?
     解决方法:安装telnet客户端控制面板-->程序-->程序和功能(appwiz.cpl)-->启用或关闭Windows功能-->功能-->添加功能-->telnet客户端-->安装......
  • ThreadPoolExecutor的使用
    线程池的基类是concurrent.futures模块中的Executor,Executor提供了两个子类,即ThreadPoolExecutor和ProcessPoolExecutor,其中ThreadPoolExecutor用于创建线程池,而ProcessPoolExecutor用于创建进程池。如果使用线程池/进程池来管理并发编程,那么只要将相应的task函数提......
  • 使用4G通信模块和MQTT协议,完成物联网设备开发。
    使用4G通信模块和MQTT协议,完成物联网设备开发。(1)安装并使用4G模块通信模块,建立microPython开发环境;(2)使用提供的Demo开发例程,使用MQTT传输协议连接阿里或腾讯网站,完成物联网设备开发。(3)将温湿度信息上传到网站;(4)手机APP查看数一、这是我之前写关于阿里云怎么在线调试设备的。......
  • Mybatis-Plus使用技巧
    selectOne和selectListselectOne如果没有数据会得到nullselectList如果没有数据会得到长度为0的list自动填充任何使用wrapper的时候,自动填充都是失效的,必须带实体类,可以new一个更新字段为null默认情况:全局配置默认值为not_null,传递的参数中某个字段为null,则默认不会对为nu......
  • Qt5 C++ 多线程工业气体标定 1)使用OPC 封装COM 2)C++调用OPC; 3
    Qt5C++多线程工业气体标定1)使用OPC封装COM2)C++调用OPC;3)使用经典界面;4)使用QT专业皮肤编程qss;5)C++链接PLC读写数据;6)赠送KEPSVR服务器;参数如下:-----------------------------1)编程语言:C++(11或以上);-----------------------------2)编程环境:QT5.14;-----------------------------......