zoukankan      html  css  js  c++  java
  • 数字计算的工具类 BigDecimal

    当我们的程序中用到计算的时候,最好把金额、数字使用java.math.BigDecimal来定义。

    一下是工具类:

    View Code
    package com.pingan.saims.scms.fundplan.util;
    
    import java.math.BigDecimal;
    import java.text.DecimalFormat;
    import java.text.NumberFormat;
    
    import com.opensymphony.oscache.util.StringUtil;
    
    /**BigDecimal 对应的加减乘除、格式化等方法<br />
     * 路人甲
     * @author EX-CHENWEIXIAN001
     *2012-11-8
     */
    public class NumberUtils {
    
        /**
         * 默认返回小数2位
         */
        public static final int DEFAULT_SCALE = 2;
        
        /**
         * 提供精确的加法运算。
         * 
         * @param v1 被加数
         * @param v2 加数
         * @return 两个参数的和
         */
        public static BigDecimal add(BigDecimal b1, BigDecimal b2) {
            return b1.add(b2);
        }
    
        /**
         * 提供精确的减法运算。
         * 
         * @param v1 被减数
         * @param v2 减数
         * @return 两个参数的差
         */
        public static BigDecimal sub(BigDecimal b1, BigDecimal b2) {
            return b1.subtract(b2);
        }
    
        /**
         * 提供精确的乘法运算。
         * 
         * @param v1 被乘数
         * @param v2 乘数
         * @return 两个参数的积
         */
        public static BigDecimal mul(BigDecimal b1, BigDecimal b2) {
            return b1.multiply(b2);
        }
    
        /**
         * 提供(相对)精确的除法运算,当发生除不尽的情况时,精确到 小数点以后10位,以后的数字四舍五入。
         * 
         * @param v1 被除数
         * @param v2 除数
         * @return 两个参数的商
         */
        public static BigDecimal div(BigDecimal b1, BigDecimal b2) {
            return div(b1, b2, DEFAULT_SCALE);
        }
    
        /**
         * 提供(相对)精确的除法运算。当发生除不尽的情况时,由scale参数指 定精度,以后的数字四舍五入。
         * 
         * @param v1 被除数
         * @param v2 除数
         * @param scale 表示表示需要精确到小数点以后几位。
         * @return 两个参数的商
         */
        public static BigDecimal div(BigDecimal b1, BigDecimal b2, int scale) {
            if (scale < 0) {
                throw new IllegalArgumentException("默认小数位必须大于或者0!");
            }
            return b1.divide(b2, scale, BigDecimal.ROUND_HALF_UP);
        }
    
        /**
         * 提供精确的小数位四舍五入处理。
         * 
         * @param v 需要四舍五入的数字
         * @param scale 小数点后保留几位
         * @return 四舍五入后的结果
         */
        public static BigDecimal round(BigDecimal b, int scale) {
            if (scale < 0) {
                throw new IllegalArgumentException("默认小数位必须大于或者0!");
            }
            BigDecimal one = new BigDecimal("1");
            return b.divide(one, scale, BigDecimal.ROUND_HALF_UP);
        }
        
        /**
         * 格式化信息内容
         * 
         * @param v 需要四舍五入的数字
         * @param scale 小数点后保留几位
         * @return 格式化后的结果
         */
        public static String format(BigDecimal b, int scale) {
            if (scale < 0) {
                throw new IllegalArgumentException("默认小数位必须大于或者0!");
            }
            StringBuffer formatString = new StringBuffer("###,##0");
            if (scale > 0)
            {
                formatString.append(".");
                for (int i = 0; i < scale; i++)
                {
                    formatString.append("0");
                }
            }
            NumberFormat numberFormat = new DecimalFormat(formatString.toString()); 
            
            return numberFormat.format(b);
        }
    
        /**字符串转换为数据类型
         * 
         * @param str
         * @return
         */
        public static BigDecimal stringToBigDecimal(String str)
        {
            if (!StringUtil.isEmpty(str))
            {
                return new BigDecimal(str);
            }
            return null;
        }
        /**
         * 测试
         * 
         * @param args
         */
        public static void main(String[] args) {
            BigDecimal v1 = new BigDecimal("10.58");
            BigDecimal v2 = new BigDecimal("5");
            BigDecimal v3 = new BigDecimal("5555555555.2722222226");
            System.out.println(NumberUtils.add(v1, v2));
            System.out.println(NumberUtils.sub(v1, v2));
            System.out.println(NumberUtils.mul(v1, v2));
            System.out.println(NumberUtils.div(v1, v2));
            System.out.println(NumberUtils.div(v1, v2,3));
            System.out.println(NumberUtils.round(v3, 1));
            System.out.println(NumberUtils.format(v3, 5));
            
        }
    }
  • 相关阅读:
    vue3.0之如何挂到vue原型,这种全局变量,方法,属性
    javascript中apply、call和bind的区别
    vue云标签效果升级版,动态钻形
    仅使用HTML和CSS实现的标签云效果 Fants
    export export default import * as zh
    vue国际化之vue-i18n使用
    linux 修改mysql 密码 (5.7版本)
    更改Java程序时间
    keepalive+mysql5.7
    mysql 授予用户所有权限
  • 原文地址:https://www.cnblogs.com/a393060727/p/2988672.html
Copyright © 2011-2022 走看看