BigDecimal加减乘除次方运算及比较大小
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加减乘除次方运算及比较大小相关推荐
- BigDecimal 类型转换、运算、比较
序:Java在java.math包中提供的API类BigDecimal,用来对超过16位有效位的数进行精确的运算.双精度浮点型变量double可以处理16位有效数.在实际应用中,需要对更大或者更小的数 ...
- BigDecimal加减乘除,以及四舍五入方法
BigDecimal加减乘除,以及四舍五入 代码实例: 四舍五入模式 代码实例: BigDecimal numO= new BigDecimal("10"); BigDecimal ...
- 利用计算机进行有理数的运算教学反思,《有理数加减乘除混合运算》教学反思...
<有理数加减乘除混合运算>教学反思 作为一名到岗不久的老师,课堂教学是我们的工作之一,通过教学反思可以快速积累我们的教学经验,那么你有了解过教学反思吗?下面是小编收集整理的<有理数加 ...
- java加减乘除运算顺序_java 实现加减乘除混合运算
初衷:解决小学一年级到四年级 基本加减乘除混合运算 基本思路: 表达式:100+3+2-200+(10000/5+(100/2)) 此类表达式我们称之为中缀表达式(运算符在数字的中间),如果我们稍加转 ...
- 分数加减乘除混合运算带答案_分数分数加减乘除混合运算练习题及答案_0.doc
分数分数加减乘除混合运算练习题及答案_0 精品文档 2016全新精品资料-全新公文范文-全程指导写作 –独家原创 PAGE1 / NUMPAGES19 分数分数加减乘除混合运算练习题及答案 1.直接写 ...
- html输入公式得到混合运算结果,excel表格如何用公式计算加减乘除混合运算-excel乘法如何计算,excel函数怎么计算乘法...
Excel支持数学中的四则运算,直接在目标单元格写相应的公式即可.例百如求A1减B1的差,在C1单元格可输入:=A1-B1 需注意: Excel里面任何公式(包括数学四则运算)都是需要以等号度开头. ...
- 实现加减乘除混合运算和归零功能的计算器
h5 部分代码: <div class="main">简易计算<div class="calculater"><table> ...
- c语言循环计算分式加减乘除混合运算,计算()_分式的加减乘除混合运算及分式的化简_中学题库-沪江中学学科网...
分式加减乘除混合运算:分式的混合运算应先乘方,再乘除,最后算加减,有括号的先算括号内的,也可以把除法转化为乘法,再运用乘法运算. 分式化简:在数学上,化简是十分重要的概念,一些复杂难辨的式子,很多时候 ...
- java编写计算类加减乘除_老师要求张浩使用面向对象的思想编写一个计算器类(Calculator),可以实现两个整数的加减乘除的运算.java...
导航:网站首页 > 老师要求张浩使用面向对象的思想编写一个计算器类(Calculator),可以实现两个整数的加减乘除的运算.java 时间:2019-4-10 老师要求张浩使用面向对象的思想编 ...
最新文章
- Hbuilder开发移动App(1)
- paip. 提升性能---hibernate的缓存使用 总结
- RDIFramework.NET ━ .NET快速信息化系统开发框架 V3.0 版新增系统参数管理
- 用 golang 1.11 module 做项目版本管理
- E470 外放没声音问题解决
- 关于WEB标准的理解
- 动产抵押物监控系统/金融抵押监控系统设计与实现
- win10 加快开机速度
- layui 表单模板
- apache性能调优(转)
- 指甲半月痕的奥秘!!
- SpringData示例
- Jacobi的GPU并行迭代 OpenACC
- Ubuntu关机和重启的命令
- 静态分析工具PMD使用说明
- linux 下网络编程 聊天室项目
- 自定义类 无极限树形结构菜单(繁杂版)
- 我与我的专业计算机作文500字,电脑走进我的生活作文500字
- 基于c51单片机的毕业设计——智能温度控制
- file_put_contents(): Only 0 of 317 bytes written, possibly out of free disk space
热门文章
- LaTeX支持中文英文混排编译的三种方式—Slager!
- 隔年增长的题_隔年增长率还可以这么求
- 【项目四】C++实现反射机制(通过宏和包装Lambda表达式实现)
- Android开发画出中国地图,Android 绘制中国地图
- superset1.5开发,中国地图实现中文版
- json txt格式转换器_BIOM:生物观测矩阵——微生物组数据通用数据格式
- gorm preload 搜索_Win10 的13个最佳免费搜索工具(下)
- DDD系列 实战一 应用设计案例 (golang)
- Android live tv,LiveTvplay
- 某招聘app上海地区数据分析招聘分析