zoukankan      html  css  js  c++  java
  • java 精确计算 好用的工具类 BigDecimal

    java 精确计算 好用的工具类

    package cn.wangbingchen.mytoolwarehouse.tools;
    
    import java.math.BigDecimal;
    
    /**
     * IT野王
     * 自认为好用的计算工具
     * 例如计算 8*23/6 结果保留3位小数
     * BigDecimalUtil.getInstance(8).multiply(16).divide(6).getDoubleVal(3)
     *
     */
    
    public class BigDecimalUtil{
    
        //计算默认精度
        private Integer DEFAULT_DIV_SCALE_100 = 100;
    
        //计算结果存储
        private BigDecimal bigDecimal;
    
        //构造方法
        private BigDecimalUtil(String val){
            this.bigDecimal = new BigDecimal(val);
        }
    
        //对外构建方法
        public static BigDecimalUtil getInstance(String val){
            return new BigDecimalUtil(val);
        }
        //对外构建方法
        public static BigDecimalUtil getInstance(double val){
            return new BigDecimalUtil(Double.toString(val));
        }
    
        //设置除数精度
        public BigDecimalUtil setScale(Integer scale){
            if (scale <= 0) {
                throw new IllegalArgumentException("设置的精度不能小于等于0");
            }
            this.DEFAULT_DIV_SCALE_100 = scale;
            return this;
        }
    
        //除法默认 保留小数点100位
        public BigDecimalUtil divide(double val) {
            this.bigDecimal = this.bigDecimal.divide(BigDecimal.valueOf(val), DEFAULT_DIV_SCALE_100, BigDecimal.ROUND_HALF_EVEN);
            return this;
        }
    
        //加法 保留小数点100位
        public BigDecimalUtil add(double val) {
            this.bigDecimal = this.bigDecimal.add(BigDecimal.valueOf(val));
            return this;
        }
    
        //加法 保留小数点100位
        public BigDecimalUtil add(String val) {
            this.bigDecimal = this.bigDecimal.add(new BigDecimal(val));
            return this;
        }
    
        //减法 保留小数点100位
        public BigDecimalUtil subtract(double val) {
            this.bigDecimal = this.bigDecimal.subtract(BigDecimal.valueOf(val));
            return this;
        }
    
        //减法 保留小数点100位
        public BigDecimalUtil subtract(String val) {
            this.bigDecimal = this.bigDecimal.subtract(new BigDecimal(val));
            return this;
        }
    
        //乘法 保留小数点100位
        public BigDecimalUtil multiply(double val) {
            this.bigDecimal = this.bigDecimal.multiply(BigDecimal.valueOf(val));
            return this;
        }
    
        //乘法 保留小数点100位
        public BigDecimalUtil multiply(String val) {
            this.bigDecimal = this.bigDecimal.multiply(new BigDecimal(val));
            return this;
        }
    
    
    
    
        //取为 String 类型的结果
        public String getStringVal(){
            return this.bigDecimal.toString();
        }
    
        //取为 String 类型的结果 可以指定 保留的小数点
        public String getStringVal(int scale){
            if (scale == 0) {
                throw new IllegalArgumentException("除数不能为0");
            }
            return this.bigDecimal.divide(BigDecimal.valueOf(1), scale, BigDecimal.ROUND_HALF_EVEN).toString();
        }
    
        //取为 Double 类型的结果
        public Double getDoubleVal(){
            return this.bigDecimal.doubleValue();
        }
        //取为 Double 类型的结果 可以指定 保留的小数点
        public Double getDoubleVal(int scale){
            if (scale == 0) {
                throw new IllegalArgumentException("除数不能为0");
            }
            return this.bigDecimal.divide(BigDecimal.valueOf(1), scale, BigDecimal.ROUND_HALF_EVEN).doubleValue();
        }
    
        //取为 Integer 类型的结果
        public Integer getIntegerVal(){
            return this.bigDecimal.intValue();
        }
        //取为 Float 类型的结果
        public Float getFloatValue(){
            return this.bigDecimal.floatValue();
        }
        //取为 Long 类型的结果
        public Long getLongValue(){
            return this.bigDecimal.longValue();
        }
    
    }
    
    

    使用方式

    计算:10除以3 保留5位小数

    BigDecimalUtil.getInstance(10).divide(3).getDoubleVal(5);
    

    结果:3.33333

    计算:20除以3除以7 保留10位小数

    BigDecimalUtil.getInstance(20).divide(3).divide(7).getDoubleVal(12);
    

    结果:0.952380952381

  • 相关阅读:
    leetcode4. Median of Two Sorted Arrays
    leetcode5. Longest Palindromic Substring
    leetcode3. Longest Substring Without Repeating Characters
    leetcode1. Two Sum
    leetcode2. Add Two Numbers
    用python slearning类库实现数据挖掘(python3.x)
    hihocoder 1519 : 逃离迷宫II
    hihocoder1524
    Android零基础入门第33节:Android事件处理概述
    Android零基础入门第32节:新推出的GridLayout网格布局
  • 原文地址:https://www.cnblogs.com/wangbingchen/p/13870252.html
Copyright © 2011-2022 走看看