java金额计算归整

背景

在项目开发中,经常遇到关于金额的计算,下单逻辑中,账务报表中等等一系列和金额相关的业务都会存在。当前的经济社会,最让人敏感的也莫过于这些金额数字,如果这些地方出问题,带来的后果可想而知。

君欲善其事必先利其器,作为一个开发人员,一定要经常性的创建与收集一些可靠的工具来帮助我们~

目的

分享与整理,望曾经在此处跌倒过的人共勉

方式

千里之堤溃于蚁泬,一个工具类的整理,虽然简单,确能保证系统中关于金额的准确性与有效性

直接上代码

    /**
     * 两个double类型的数值相加
     */
    public static double add(double v1, double v2) {
        BigDecimal b1 = BigDecimal.valueOf(v1);
        BigDecimal b2 = BigDecimal.valueOf(v2);
        return b1.add(b2).doubleValue();
    }

    /**
     * 两个String类型的数值相加
     */
    public static String add(String v1, String v2){
        BigDecimal b1 = new BigDecimal(v1);
        BigDecimal b2 = new BigDecimal(v2);
        return b1.add(b2).toString();
    }

    /**
     * 相减
     */
    public static double sub(double v1, double v2) {
        BigDecimal b1 = BigDecimal.valueOf(v1);
        BigDecimal b2 = BigDecimal.valueOf(v2);
        return b1.subtract(b2).doubleValue();
    }

    /**
     * 相减
     */
    public static double sub(String v1, String v2) {
        BigDecimal b1 = new BigDecimal(v1);
        BigDecimal b2 = new BigDecimal(v2);
        return b1.subtract(b2).doubleValue();
    }
    /**
     * 相乘,此处默认保留两位小数
     * 并使用四舍五入原则取值
     */
    public static double mul(double v1, double v2) {
        BigDecimal b1 = BigDecimal.valueOf(v1);
        BigDecimal b2 = BigDecimal.valueOf(v2);
        return b1.multiply(b2).setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();
    }
    /**
     * 相除,此处默认保留两位小数
     * 并使用四舍五入原则取值
     */
    public static double div(double v1, double v2) {
        BigDecimal b1 = BigDecimal.valueOf(v1);
        BigDecimal b2 = BigDecimal.valueOf(v2);
        return b1.divide(b2, 2, BigDecimal.ROUND_HALF_UP).doubleValue();
    }
    /**
     * 将dubbo类型转为string类型
     * 格式化金额,统一保留2位小数
     */
	public static String formatAmount(Double amount){
        NumberFormat nf = NumberFormat.getInstance();
        //设置最大保留小数位数
        nf.setMaximumFractionDigits(2);
        //取消','等计数方式
        nf.setGroupingUsed(false);
        return nf.format(amount);
    }

后话与注意

1、代码中对于金额的计算尽量避免使用+,-,*,/这些操作,要用上述工具方法进行替代

2、此处整理并非全面,每个人都有自己的使用习惯,在此只做提笔,不敢妄言指教

3、JDK官方已经不再建议使用new Bigdecimal(double v)这种方式的构造方法,尽量使用string类型传值

      而BigDecimal.valueOf(v1)的源码即:

因而都使用了此方式

4、文中若错误及不当之处,望指教与提醒,十分感激。

5、多整理,多总结,希望我们都能超神

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值