• 数字计算的工具类 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));
            
        }
    }
  • 相关阅读:
    关于源码编译每次提示有错误 要make update-api
    如何在Android中添加系统服务
    git查看每个版本间的差异
    achartengine画出动态折线图
    java中基本数据类型和C语言中基本数据类型转换
    获取图片的真实宽高
    hdu-2066-一个人的旅行
    Linux内核模块编程与内核模块LICENSE -《具体解释(第3版)》预读
    Android平台Camera实时滤镜实现方法探讨(十一)--实时美颜滤镜
    ios9定位服务的app进入后台三分钟收不到经纬度,应用被挂起问题及解决方式
  • 原文地址:https://www.cnblogs.com/a393060727/p/2988672.html
Copyright © 2020-2023  润新知