首页 > 其他分享 >BigDecimal的加减乘除

BigDecimal的加减乘除

时间:2023-11-08 16:02:49浏览次数:33  
标签:return BigDecimal double param v1 v2 加减乘除


BigDecimal类

BigDecimal的加减乘除_四舍五入


BigDecimal的加减乘除

import java.math.BigDecimal; 
public class Arith { 
/** 
* 由于Java的简单类型不能够精确的对浮点数进行运算,这个工具类提供精 
* 确的浮点数运算,包括加减乘除和四舍五入。 
*/ 
//默认除法运算精度 
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)); 
        return b1.divide(b2,scale,BigDecimal.ROUND_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,BigDecimal.ROUND_HALF_UP).doubleValue(); 
    } 
    
   /** 
    * 提供精确的类型转换(Float) 
    * @param v 需要被转换的数字 
    * @return 返回转换结果 
    */ 
    public static float convertsToFloat(double v){ 
    BigDecimal b = new BigDecimal(v); 
    return b.floatValue(); 
    } 
    
    /** 
* 提供精确的类型转换(Int)不进行四舍五入 
* @param v 需要被转换的数字 
* @return 返回转换结果 
*/ 
public static int convertsToInt(double v){ 
BigDecimal b = new BigDecimal(v); 
    return b.intValue(); 
} 
/** 
* 提供精确的类型转换(Long) 
* @param v 需要被转换的数字 
* @return 返回转换结果 
*/ 
public static long convertsToLong(double v){ 
BigDecimal b = new BigDecimal(v); 
    return b.longValue(); 
} 
/** 
* 返回两个数中大的一个值 
* @param v1 需要被对比的第一个数 
* @param v2 需要被对比的第二个数 
* @return 返回两个数中大的一个值 
*/ 
public static double returnMax(double v1,double v2){ 
BigDecimal b1 = new BigDecimal(v1); 
BigDecimal b2 = new BigDecimal(v2); 
    return b1.max(b2).doubleValue(); 
} 
/** 
* 返回两个数中小的一个值 
* @param v1 需要被对比的第一个数 
* @param v2 需要被对比的第二个数 
* @return 返回两个数中小的一个值 
*/ 
public static double returnMin(double v1,double v2){ 
BigDecimal b1 = new BigDecimal(v1); 
BigDecimal b2 = new BigDecimal(v2); 
    return b1.min(b2).doubleValue(); 
} 
/** 
* 精确对比两个数字 
* @param v1 需要被对比的第一个数 
* @param v2 需要被对比的第二个数 
* @return 如果两个数一样则返回0,如果第一个数比第二个数大则返回1,反之返回-1 
*/ 
public static int compareTo(double v1,double v2){ 
BigDecimal b1 = new BigDecimal(v1); 
BigDecimal b2 = new BigDecimal(v2); 
    return b1.compareTo(b2); 
} 

}


BigDecimal小数点处理


BigDecimal.setScale()方法用于格式化小数点
setScale(1)表示保留一位小数,默认用四舍五入方式 
setScale(1,BigDecimal.ROUND_DOWN)直接删除多余的小数位,如2.35会变成2.3 
setScale(1,BigDecimal.ROUND_UP)进位处理,2.35变成2.4 
setScale(1,BigDecimal.ROUND_HALF_UP)四舍五入,2.35变成2.4


setScaler(1,BigDecimal.ROUND_HALF_DOWN)四舍五入,2.35变成2.3,如果是5则向下舍




 


注释:


1: scale指的是你小数点后的位数。比如123.456则score就是3.


score()就是BigDecimal类中的方法啊。
比如:BigDecimal b = new BigDecimal("123.456");


b.scale(),返回的就是3.


2:roundingMode是小数的保留模式。它们都是BigDecimal中的常量字段,有很多种。
比如:BigDecimal.ROUND_HALF_UP表示的就是4舍5入。
3:pubilc BigDecimal divide(BigDecimal divisor, int scale, int roundingMode)
的意思是说:我用一个BigDecimal对象除以divisor后的结果,并且要求这个结果保留有scale个小数位,roundingMode表示的就是保留模式是什么,是四舍五入啊还是其它的,你可以自己选!


4:对于一般add、subtract、multiply方法的小数位格式化如下:



BigDecimal mData = new BigDecimal("9.655").setScale(2, BigDecimal.ROUND_HALF_UP);
System.out.println("mData=" + mData);



----结果:----- mData=9.66




标签:return,BigDecimal,double,param,v1,v2,加减乘除
From: https://blog.51cto.com/u_809530/8255968

相关文章

  • BigDecimal有哪些常见的坑
    使用BigDecimal时,以下是一些常见的坑和注意事项:1.精度丢失问题:BigDecimal是用于处理精确计算的,但在进行数值运算时可能会出现精度丢失的问题。例如,两个BigDecimal对象相除可能得到一个无限循环的小数,需要通过指定舍入规则(RoundingMode)来控制结果的精度。BigDecimaldividend=n......
  • BigDecimal java.lang.ArithmeticException: / by zero问题
    BigDecimalbigDecimal=newBigDecimal("0.0");BigDecimalbigDecimal1=newBigDecimal(0);//一定要用compareTo去比较被除数是否为0,不能用equalsif(BigDecimal.ZERO.compareTo(bigDecimal)==0||bigDecimal==null){System.out.println("true1111");}......
  • double型数据加减乘除工具类
    publicclassDoubleUtil{/***很小的数值用于double和0比较存在尾差问题***/privatestaticfinalDoubleminVal=0.00001;/***两个Double数相加**@paramv1*@paramv2*@return*/publicstatic......
  • JAVA中char类型加减乘除运算表达式返回类型
    我们都知道java中,如果char类型和int类型做加减法,那么char类型会被精度提升至int类型然后参与运算,返回的也是int类型的数据。那么如果表达式中参与运算的均为char类型,那么表达式返回的类型是什么呢?'A'-'a'经过简单测试,是int类型。charc='w';sb.append('A'+c-'a');......
  • 高精度(加减乘除)
    高精度(加减乘除)高精度的核心思想就是利用数组去储存大数,然后通过模拟手动计算的方式,来进行计算。主要分三个模块:1.读入数据并转换为(int)类型储存高精度加法核心思想:将每个位上的数字都+起来,如果大于10就进位。核心代码如下:c[i]+=a[i]+b[i];//两数相加c[i+1]+=c[i]/10;//进......
  • 05BigDecimal类
    BigDecimalBigDecimal是一个精度更高的一个类。位置:java.math包中。作用:精确计算浮点数。创建方式:BigDecimalbd=newBigDecimal("1.0");方法:BigDecimaladd(BigDecimalbd);加BigDecimalsubtract(BigDecimalbd);减BigDecimalmultiply(BigDecimalbd);乘......
  • Java拾贝第七天——包装类、BigInteger、BigDecimal
    Java拾贝不建议作为0基础学习,都是本人想到什么写什么基本数据类型怎么变化引用数据类型(对象)Java为每种基本类型都提供了对应的包装类型:基本数据类型包装类intIntegercharCharactershortShortlongLongfloatFloatdoubleDoublebooleanBoolean......
  • 高精度加减乘除
    大整数的高精度运算加法#include<bits/stdc++.h>usingnamespacestd;vector<int>big_num_add(vector<int>n1,vector<int>n2){vector<int>ans;intt=0;for(inti=0;i<n1.size()||i<n2.size();i++){if(i&l......
  • 请完善课上的口算题卡代码,实现重复题目的检测、题目数字范围、加减乘除算式的参数化等
    importjava.util.HashSet;importjava.util.Random;importjava.util.Set;publicclassMathQuizGenerator{  publicstaticvoidmain(String[]args){    intnumberOfQuestions=10;//设定生成题目的数量    intminNumber=1;//题目数字的最小值 ......
  • JS 数字类型的加减乘除, 四舍五入保持精度
    Number.prototype.toFixed=function(d=0){ letchangeNum=this+''//把数字转为字符串 if(changeNum.indexOf('-')!=-1){//判断是否是负数 changeNum=Math.abs(Number(changeNum))} changeNum=(Math.round(Number(changeNum)*Math.......