首页 > 其他分享 >解决计算精确问题,让它变得更加人性化,不考虑性能

解决计算精确问题,让它变得更加人性化,不考虑性能

时间:2022-11-22 10:47:12浏览次数:59  
标签:BigDecimal val 性能 private 人性化 精确 public BigDecimalUtil

解决计算精确问题,让它变得更加人性化,不考虑性能

码云地址:https://gitee.com/wang_bingchen/utils-wbc.git

有bug欢迎 fork

package com.wbc.utils;

import java.math.BigDecimal;

/**
 * 解决计算精确问题,让它变得更加人性化,不考虑性能
 * @author wangbingchen
 * @create 2021-08-10 15:01
 */
public class BigDecimalUtil{


    //计算默认精度
    private Integer DEFAULT_DIV_SCALE_100 = 100;

    //计算结果存储
    private BigDecimal bigDecimal;

    private BigDecimalUtil(){}

    //构造方法
    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();
    }

    public static void main(String[] args) {
        // 计算 100 除以 3 并且保留 2位小数 得到 Double 结果
        Double doubleVal = BigDecimalUtil.getInstance("100").divide(3).getDoubleVal(2);
        System.out.println(doubleVal);
        // 计算 800 除以 6 并且保留 4位小数 得到 String 结果
        String stringVal = BigDecimalUtil.getInstance(12.31).divide(6).getStringVal(4);
        System.out.println(stringVal);

        //详细说明 使用 BigDecimalUtil.getInstance() 初始化计算数字,可传 String参数或者 double 参数
        // 接着调用
        // 加 add()
        // 减 subtract()
        // 乘 multiply()
        // 除 divide()
        // 最后调用 getDoubleVal() getStringVal() getIntegerVal() 等方法 获取对应数据类型结果
        //其中 getStringVal() 和 getDoubleVal() 可传 int 参数 为保留的小数位数
        // setScale() 方法可以设置保留指定小数位数 后继续计算
        //

        System.out.println(BigDecimalUtil.getInstance(800).divide(3).multiply(3).getStringVal(2));

    }

}

标签:BigDecimal,val,性能,private,人性化,精确,public,BigDecimalUtil
From: https://www.cnblogs.com/wangbingchen/p/16914323.html

相关文章

  • MySQL性能分析方法
    1.影响MySQL性能的因素SQL查询速度CPU、内存网卡流量磁盘IO大表大事务2.指标特征及其影响高QPS(每秒查询数)/TPS(每秒事务数)SQL执行效率低。高并发数......
  • 性能调优 session 1 - 计算机体系结构 量化研究方法
    近期本人参与的存储系统项目进入到性能调优阶段,当前系统的性能指标离项目预期目标还有较大差距。本人一直奉行"理论指导下的实践",反对凭感觉调试。尤其在调试初期,更要抓住......
  • VS Code 是如何优化启动性能的?
    VSCode是如何优化启动性能的?作者:柳千 发布于:2021-9-810:00:00本文主要是对 CovalenceConf2019:VisualStudioCode–TheFirstSecond 这次分享的介绍,Co......
  • 【转】Win2003下Apache性能优化 增加13/1/30
    一直习惯在Solaris和linux下跑amp,前些时服务器硬盘坏掉,所以启用新服务器。新系统是Windows2003Server,在上面按Unix上的经验配置Apache和Mysql时问题多多,经过折腾,总算是......
  • mysql中性能分析Profiling
    ​概念 ​​ShowProfile​​是mysql提供可以用来分析当前会话中语句执行的资源消耗情况,可以用于Sql调优的测量。 示例 1、先查看是否开启了此功能,默认情况下,参数处于关......
  • Unity性能优化汇总
    1.UI方面,UGUI的优化方式参考:Unity优化之UGUI(2017年版【一】) 2.C#方面的优化 3.网络同步方面的优化 4.CPU方面的优化降低DrawCall 5.GPU方面的优化不要......
  • 两行CSS让页面提升了近7倍渲染性能!
    前言对于前端人员来讲,最令人头疼的应该就是页面性能了,当用户在访问一个页面时,总是希望它能够快速呈现在眼前并且是可交互状态。如果页面加载过慢,你的用户很可能会因此离你......
  • 嵌入式软件异步编程:异步带来的性能提升
    以两个串口同时发送数据为例比较异步和同步的发送性能。同步编程TXD1发送时不能处理其它任务TXD2要在TXD1发送完成后才能开始发送总发送时间为TXD1和TXD2的发送时间总和,约为......
  • Web 性能优化:HTTP
    个人博客Web性能优化:TCPWeb性能优化:TLS⚓Web性能优化:HTTP以Web应用为代表的互联网肇始于1991年TimBerners-Lee提出的HTTP/0.9协议,经过30多年的发展,伴......
  • Web 性能优化:TLS
    Web性能优化:TCP......