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. Hbuilder开发移动App(1)
  2. paip. 提升性能---hibernate的缓存使用 总结
  3. RDIFramework.NET ━ .NET快速信息化系统开发框架 V3.0 版新增系统参数管理
  4. 用 golang 1.11 module 做项目版本管理
  5. E470 外放没声音问题解决
  6. 关于WEB标准的理解
  7. 动产抵押物监控系统/金融抵押监控系统设计与实现
  8. win10 加快开机速度
  9. layui 表单模板
  10. apache性能调优(转)
  11. 指甲半月痕的奥秘!!
  12. SpringData示例
  13. Jacobi的GPU并行迭代 OpenACC
  14. Ubuntu关机和重启的命令
  15. 静态分析工具PMD使用说明
  16. linux 下网络编程 聊天室项目
  17. 自定义类 无极限树形结构菜单(繁杂版)
  18. 我与我的专业计算机作文500字,电脑走进我的生活作文500字
  19. 基于c51单片机的毕业设计——智能温度控制
  20. file_put_contents(): Only 0 of 317 bytes written, possibly out of free disk space

热门文章

  1. LaTeX支持中文英文混排编译的三种方式—Slager!
  2. 隔年增长的题_隔年增长率还可以这么求
  3. 【项目四】C++实现反射机制(通过宏和包装Lambda表达式实现)
  4. Android开发画出中国地图,Android 绘制中国地图
  5. superset1.5开发,中国地图实现中文版
  6. json txt格式转换器_BIOM:生物观测矩阵——微生物组数据通用数据格式
  7. gorm preload 搜索_Win10 的13个最佳免费搜索工具(下)
  8. DDD系列 实战一 应用设计案例 (golang)
  9. Android live tv,LiveTvplay
  10. 某招聘app上海地区数据分析招聘分析