BigDecimal需要进行初始化,这里我对比两种初始化值的结果

        BigDecimal big1 = new BigDecimal(0.05);BigDecimal big2 = new BigDecimal(10000);BigDecimal big3 = new BigDecimal(-10000);// 推荐使用string初始化,不会造成精度丢失BigDecimal strbig1 = new BigDecimal("0.05");BigDecimal strbig2 = new BigDecimal("10000");BigDecimal strbig3 = new BigDecimal("-10000");BigDecimal strbig4 = new BigDecimal("2");
  • add() 加法
  • subtract() 减法
  • multiply() 乘法
  • divide() 除法
  • pow() 次方
  • abs() 绝对值
         // 加BigDecimal result1 = big1.add(big2);BigDecimal strresult1 = strbig1.add(strbig2);// 减BigDecimal result2 = big1.subtract(big2);BigDecimal strresult2 = strbig1.subtract(strbig2);// 乘BigDecimal result3 = big1.multiply(big2);BigDecimal strresult3 = strbig1.multiply(strbig2);// 除BigDecimal result4 = big2.divide(big1, 20, BigDecimal.ROUND_HALF_UP);BigDecimal strresult4 = strbig2.divide(strbig1, 20, BigDecimal.ROUND_HALF_UP);// 次方  pow(几次方) 例如 2的3次方BigDecimal result = strbig4 .pow(3); // 结果:8// 绝对值BigDecimal result5 = big3.abs();BigDecimal strresult5 = strbig3.abs();

结果如下图:

从这里不难看出,存在了差异,这也是为什么初始化建议使用string的原因

注意:

1)System.out.println()中的数字默认是double类型的,double类型小数计算不精准。

2)使用BigDecimal类构造方法传入double类型时,计算的结果也是不精确的!

因为不是所有的浮点数都能够被精确的表示成一个double 类型值,有些浮点数值不能够被精确的表示成 double 类型值,因此它会被表示成与它最接近的 double 类型的值。必须改用传入String的构造方法。这一点在BigDecimal类的构造方法注释中有说明。

完整的测试代码如下:

    public static void main(String[] args) {BigDecimal big1 = new BigDecimal(0.05);BigDecimal big2 = new BigDecimal(10000);BigDecimal big3 = new BigDecimal(-10000);BigDecimal strbig1 = new BigDecimal("0.05");BigDecimal strbig2 = new BigDecimal("10000");BigDecimal strbig3 = new BigDecimal("-10000");// 加BigDecimal result1 = big1.add(big2);BigDecimal strresult1 = strbig1.add(strbig2);// 减BigDecimal result2 = big1.subtract(big2);BigDecimal strresult2 = strbig1.subtract(strbig2);// 乘BigDecimal result3 = big1.multiply(big2);BigDecimal strresult3 = strbig1.multiply(strbig2);// 除BigDecimal result4 = big2.divide(big1, 20, BigDecimal.ROUND_HALF_UP);BigDecimal strresult4 = strbig2.divide(strbig1, 20, BigDecimal.ROUND_HALF_UP);// 绝对值BigDecimal result5 = big3.abs();BigDecimal strresult5 = strbig3.abs();System.out.println("加法value结果:"+result1);System.out.println("加法String结果:"+strresult1);System.out.println("减法value结果:"+result2);System.out.println("减法String结果:"+strresult2);System.out.println("乘法value结果:"+result3);System.out.println("乘法String结果:"+strresult3);System.out.println("除法value结果:"+result4);System.out.println("除法String结果:"+strresult4);System.out.println("绝对值value结果:"+result5);System.out.println("绝对值String结果:"+strresult5);}

除法divide()参数使用

从divide()源码不难看出需要三个参数值

    public BigDecimal divide(BigDecimal divisor, int scale, int roundingMode) {if (roundingMode < ROUND_UP || roundingMode > ROUND_UNNECESSARY)throw new IllegalArgumentException("Invalid rounding mode");if (this.intCompact != INFLATED) {if ((divisor.intCompact != INFLATED)) {return divide(this.intCompact, this.scale, divisor.intCompact, divisor.scale, scale, roundingMode);} else {return divide(this.intCompact, this.scale, divisor.intVal, divisor.scale, scale, roundingMode);}} else {if ((divisor.intCompact != INFLATED)) {return divide(this.intVal, this.scale, divisor.intCompact, divisor.scale, scale, roundingMode);} else {return divide(this.intVal, this.scale, divisor.intVal, divisor.scale, scale, roundingMode);}}}

即为 (BigDecimal divisor 除数, int scale 精确小数位, int roundingMode 舍入模式)

八种舍入模式

1、ROUND_UP

舍入远离零的舍入模式。

在丢弃非零部分之前始终增加数字(始终对非零舍弃部分前面的数字加1)。

注意,此舍入模式始终不会减少计算值的大小。

2、ROUND_DOWN

接近零的舍入模式。

在丢弃某部分之前始终不增加数字(从不对舍弃部分前面的数字加1,即截短)。

注意,此舍入模式始终不会增加计算值的大小。

3、ROUND_CEILING

接近正无穷大的舍入模式。

如果 BigDecimal 为正,则舍入行为与 ROUND_UP 相同;

如果为负,则舍入行为与 ROUND_DOWN 相同。

注意,此舍入模式始终不会减少计算值。

4、ROUND_FLOOR

接近负无穷大的舍入模式。

如果 BigDecimal 为正,则舍入行为与 ROUND_DOWN 相同;

如果为负,则舍入行为与 ROUND_UP 相同。

注意,此舍入模式始终不会增加计算值。

5、ROUND_HALF_UP

向“最接近的”数字舍入,如果与两个相邻数字的距离相等,则为向上舍入的舍入模式。

如果舍弃部分 >= 0.5,则舍入行为与 ROUND_UP 相同;否则舍入行为与 ROUND_DOWN 相同。

注意,这是我们大多数人在小学时就学过的舍入模式(四舍五入)。

6、ROUND_HALF_DOWN

向“最接近的”数字舍入,如果与两个相邻数字的距离相等,则为上舍入的舍入模式。

如果舍弃部分 > 0.5,则舍入行为与 ROUND_UP 相同;否则舍入行为与 ROUND_DOWN 相同(五舍六入)。

7、ROUND_HALF_EVEN

向“最接近的”数字舍入,如果与两个相邻数字的距离相等,则向相邻的偶数舍入。

如果舍弃部分左边的数字为奇数,则舍入行为与 ROUND_HALF_UP 相同;

如果为偶数,则舍入行为与 ROUND_HALF_DOWN 相同。

注意,在重复进行一系列计算时,此舍入模式可以将累加错误减到最小。

此舍入模式也称为“银行家舍入法”,主要在美国使用。四舍六入,五分两种情况。

如果前一位为奇数,则入位,否则舍去。

以下例子为保留小数点1位,那么这种舍入方式下的结果。

1.15>1.2 1.25>1.2

8、ROUND_UNNECESSARY

断言请求的操作具有精确的结果,因此不需要舍入。

如果对获得精确结果的操作指定此舍入模式,则抛出ArithmeticException。

关于 BigDecimal 比较运算

方式一

     BigDecimal a = new BigDecimal(10);BigDecimal b = new BigDecimal(20);BigDecimal min = a.min(b);   // a与b比较,谁小取谁BigDecimal max = a.max(b); // a与b比较,谁大取谁

方式二

         BigDecimal a = new BigDecimal(10);BigDecimal b = new BigDecimal(20);// a,b不能为null,否则空指针if(a.compareTo(b) == -1){System.out.println("a小于b");}if(a.compareTo(b) == 0){System.out.println("a等于b");}if(a.compareTo(b) == 1){System.out.println("a大于b");}if(a.compareTo(b) > -1){System.out.println("a大于等于b");}if(a.compareTo(b) < 1){System.out.println("a小于等于b");}

总结:做大量计算上使用BigDecimal能够避免一些运算问题。如使用+ - * / 这类运算符,有时会出现精度丢失,或者出现NaN。在使用BigDecimal时,初始化推荐使用string进行初始化,

     BigDecimal myqxin = new BigDecimal(Double.toString(0.05));

BigDecimal加减乘除次方运算及比较大小相关推荐

  1. BigDecimal 类型转换、运算、比较

    序:Java在java.math包中提供的API类BigDecimal,用来对超过16位有效位的数进行精确的运算.双精度浮点型变量double可以处理16位有效数.在实际应用中,需要对更大或者更小的数 ...

  2. BigDecimal加减乘除,以及四舍五入方法

    BigDecimal加减乘除,以及四舍五入 代码实例: 四舍五入模式 代码实例: BigDecimal numO= new BigDecimal("10"); BigDecimal ...

  3. 利用计算机进行有理数的运算教学反思,《有理数加减乘除混合运算》教学反思...

    <有理数加减乘除混合运算>教学反思 作为一名到岗不久的老师,课堂教学是我们的工作之一,通过教学反思可以快速积累我们的教学经验,那么你有了解过教学反思吗?下面是小编收集整理的<有理数加 ...

  4. java加减乘除运算顺序_java 实现加减乘除混合运算

    初衷:解决小学一年级到四年级 基本加减乘除混合运算 基本思路: 表达式:100+3+2-200+(10000/5+(100/2)) 此类表达式我们称之为中缀表达式(运算符在数字的中间),如果我们稍加转 ...

  5. 分数加减乘除混合运算带答案_分数分数加减乘除混合运算练习题及答案_0.doc

    分数分数加减乘除混合运算练习题及答案_0 精品文档 2016全新精品资料-全新公文范文-全程指导写作 –独家原创 PAGE1 / NUMPAGES19 分数分数加减乘除混合运算练习题及答案 1.直接写 ...

  6. html输入公式得到混合运算结果,excel表格如何用公式计算加减乘除混合运算-excel乘法如何计算,excel函数怎么计算乘法...

    Excel支持数学中的四则运算,直接在目标单元格写相应的公式即可.例百如求A1减B1的差,在C1单元格可输入:=A1-B1 需注意: Excel里面任何公式(包括数学四则运算)都是需要以等号度开头. ...

  7. 实现加减乘除混合运算和归零功能的计算器

    h5 部分代码: <div class="main">简易计算<div class="calculater"><table> ...

  8. c语言循环计算分式加减乘除混合运算,计算()_分式的加减乘除混合运算及分式的化简_中学题库-沪江中学学科网...

    分式加减乘除混合运算:分式的混合运算应先乘方,再乘除,最后算加减,有括号的先算括号内的,也可以把除法转化为乘法,再运用乘法运算. 分式化简:在数学上,化简是十分重要的概念,一些复杂难辨的式子,很多时候 ...

  9. java编写计算类加减乘除_老师要求张浩使用面向对象的思想编写一个计算器类(Calculator),可以实现两个整数的加减乘除的运算.java...

    导航:网站首页 > 老师要求张浩使用面向对象的思想编写一个计算器类(Calculator),可以实现两个整数的加减乘除的运算.java 时间:2019-4-10 老师要求张浩使用面向对象的思想编 ...

最新文章

  1. Django的模板渲染(render)机制
  2. EnterpriseLibrary数据访问(4)使用数据访问器接收数据
  3. 使用mysqldump 导出sql数据
  4. POJ1426-Find The Multiple(DFS)
  5. Java MyBatis 占位符
  6. windows下,linux下elasticsearch安装插件marvel插件的步骤
  7. 双网关,可以上内网或外网,如何同时上内网和外网?
  8. JavaFTP文件传输 简单实现
  9. 如何加载CASS DAT格式文件
  10. 实证研究使用正交化和自助法寻找显因
  11. (附源码)springboot社区文明养宠平台 毕业设计 231609
  12. 尚硅谷Linux网络服务基础
  13. 微信小游戏开发能否突破4M限制
  14. linux服务器扩容lun,FAQ-为什么2288H V5服务器扩容LUN后系统会报错
  15. 《鱿鱼游戏》的深刻,在于足够肤浅
  16. 超融合一体机 oracle,oracle的pca私有云一体机超融合解决之道.pdf
  17. linux在代码中表示什么意思,Linux代码中的unlikely和likely分别是什么意思?
  18. tonxi的一生的奋斗目标!
  19. VB程序逆向反汇编常见的函数
  20. 大英赛C类翻译题合集

热门文章

  1. 从“钢铁大国”迈入“钢铁强国”,看我国冶金制造技术的崛起!
  2. 滴滴“洪流联盟”蓄力,无边界合作推进中国经验走向世界
  3. 人这一辈子要不要创业
  4. Android后台监听全局屏幕旋转
  5. matlab如何绘制像素格子的图_【像素画教程】超详细建筑像素场景图的绘制
  6. 转载:Linux下股票看盘软件
  7. 超实用k8s集群资源清理命令
  8. 数据库-DML增删改查
  9. HFSS拆分合并后的微带线
  10. MATLAB画论文里的图片,如何在论文中画出漂亮的插图?