首页 > 其他分享 >工具类--精确的浮点数运算

工具类--精确的浮点数运算

时间:2022-09-02 15:33:47浏览次数:41  
标签:return 运算 -- double 浮点数 param v1 v2 BigDecimal

import java.math.BigDecimal;
import java.math.RoundingMode;

/**
 * 精确的浮点数运算
 *
 */
public class Arith
{

    /** 默认除法运算精度 */
    private static final int DEF_DIV_SCALE = 10;

    /** 这个类不能实例化 */
    private Arith()
    {
    }

    /**
     * 提供精确的加法运算。
     * @param v1 被加数
     * @param v2 加数
     * @return 两个参数的和
     */
    public static double add(double v1, double v2)
    {
        BigDecimal b1 = new BigDecimal(Double.toString(v1));
        BigDecimal b2 = new BigDecimal(Double.toString(v2));
        return b1.add(b2).doubleValue();
    }

    /**
     * 提供精确的减法运算。
     * @param v1 被减数
     * @param v2 减数
     * @return 两个参数的差
     */
    public static double sub(double v1, double v2)
    {
        BigDecimal b1 = new BigDecimal(Double.toString(v1));
        BigDecimal b2 = new BigDecimal(Double.toString(v2));
        return b1.subtract(b2).doubleValue();
    }

    /**
     * 提供精确的乘法运算。
     * @param v1 被乘数
     * @param v2 乘数
     * @return 两个参数的积
     */
    public static double mul(double v1, double v2)
    {
        BigDecimal b1 = new BigDecimal(Double.toString(v1));
        BigDecimal b2 = new BigDecimal(Double.toString(v2));
        return b1.multiply(b2).doubleValue();
    }

    /**
     * 提供(相对)精确的除法运算,当发生除不尽的情况时,精确到
     * 小数点以后10位,以后的数字四舍五入。
     * @param v1 被除数
     * @param v2 除数
     * @return 两个参数的商
     */
    public static double div(double v1, double v2)
    {
        return div(v1, v2, DEF_DIV_SCALE);
    }

    /**
     * 提供(相对)精确的除法运算。当发生除不尽的情况时,由scale参数指
     * 定精度,以后的数字四舍五入。
     * @param v1 被除数
     * @param v2 除数
     * @param scale 表示表示需要精确到小数点以后几位。
     * @return 两个参数的商
     */
    public static double div(double v1, double v2, int scale)
    {
        if (scale < 0)
        {
            throw new IllegalArgumentException(
                    "The scale must be a positive integer or zero");
        }
        BigDecimal b1 = new BigDecimal(Double.toString(v1));
        BigDecimal b2 = new BigDecimal(Double.toString(v2));
        if (b1.compareTo(BigDecimal.ZERO) == 0)
        {
            return BigDecimal.ZERO.doubleValue();
        }
        return b1.divide(b2, scale, RoundingMode.HALF_UP).doubleValue();
    }

    /**
     * 提供精确的小数位四舍五入处理。
     * @param v 需要四舍五入的数字
     * @param scale 小数点后保留几位
     * @return 四舍五入后的结果
     */
    public static double round(double v, int scale)
    {
        if (scale < 0)
        {
            throw new IllegalArgumentException(
                    "The scale must be a positive integer or zero");
        }
        BigDecimal b = new BigDecimal(Double.toString(v));
        BigDecimal one = new BigDecimal("1");
        return b.divide(one, scale, RoundingMode.HALF_UP).doubleValue();
    }
}

标签:return,运算,--,double,浮点数,param,v1,v2,BigDecimal
From: https://www.cnblogs.com/cxy-lxl/p/16650107.html

相关文章

  • 时间工具类
    packagecom.app.common.util;importjava.text.DecimalFormat;importjava.text.ParseException;importjava.text.SimpleDateFormat;importjava.util.Calendar;im......
  • Zookeeper介绍
    zookeeper文件系统组成zookeeper本质上是文件系统+通知机制组成的zookeeper文件系统说明树形的文件系统,在树形文件系统当中,每一个节点就是存储数据的位置,节点同时兼顾......
  • 随笔0902补
     ......
  • Redis服务端命令请求处理
    命令处理流程1.Redis单线程单进程通过IO复用从文件事件中选出已经就绪的命令放入输入缓存区querybuffer2.一个个取出querybuffer里的命令进行解析,解析argv和argc3.通过a......
  • log4j.xml、log4j2.xml、log4j.properties都是什么?
    0.背景项目中用的SpringMVC框架,这里面用的log4j家族的东西作为日志管理,但是发现代码配置里比较混乱,log4j.xml、log4j2.xml、log4j.properties都有。这篇文章就来简单区分......
  • SQLServer 查询近期执行的sql语句
    SELECTTOP1000QS.creation_timeAS'执行时间',QS.total_elapsed_time/1000AS'耗时',QS.total_rows,SUBSTRING(ST.text,qs.statement_start_offset/2+......
  • uniapp监听页面滚动事件 onPageScroll
    data(){return{operate_dm:true,//弹幕编辑按钮默认显示isShowLog:0,timer_dm:null,......
  • 微信小程序元素超出页面宽度的解决
    有时候可能会出现这种情况,如下图底部的添加店铺的按钮超出页面宽度了,直接在给按钮外面的盒子加一个css样式:box-sizing:border-box; 这样就正常显示了 ......
  • 机器学习中的数值查找算法(3)——哈希查找算法
    原文链接:机器学习中的数值查找算法(3)——哈希查找算法–每天进步一点点(longkui.site)0.前言前面介绍的查找算法均是基于有序序列的查找方式,哈希查找是通过计算元素......
  • Painting Game (博弈论)
    题目:  VirtualJudge(vjudge.net)题目大意:2个人轮流对长条方格填黑,黑的地方不能够相邻.一个人要尽量填黑,一个人要尽量不填黑,当不能填的时候就结束题解思路:......