BigDecimal
来源:互联网 发布:cf36 1网络异常 编辑:程序博客网 时间:2024/06/03 13:07
Java在java.math包中提供的API类BigDecimal,用来对超过16位有效位的数进行精确的运算。双精度浮点型变量double可以处理16位有效数。在实际应用中,需要对更大或者更小的数进行运算和处理。float和double只能用来做科学计算或者是工程计算,在商业计算中要用java.math.BigDecimal。BigDecimal所创建的是对象,我们不能使用传统的+、-、*、/等算术运算符直接对其对象进行数学运算,而必须调用其相对应的方法。方法中的参数也必须是BigDecimal的对象。构造器是类的特殊方法,专门用来创建对象,特别是带有参数的对象。
我们先看一个简单的加减乘除:
package AOP;public class BeanTest {public static void main(String[] args) {System.out.println(0.64+1);System.out.println(1-0.42);System.out.println(4.02*10);System.out.println(4.02/10);}}输出:
1.64000000000000010.580000000000000140.1999999999999960.40199999999999997因为计算机是二进制表示的,无法精确表示浮点数!
然后就引入BigDecimal这个类,在使用它运算时分为三个步骤:
1、用float或者double变量构建BigDecimal对象。
2、通过调用BigDecimal的加,减,乘,除等相应的方法进行算术运算。
3、把BigDecimal对象转换成float,double,int等类型。
采用BigDecimal的构造方法或valueOf方法来转换BigDecimal对象
使用构造方法:
BigDecimal(int) 创建一个具有参数所指定整数值的对象。BigDecimal(double) 创建一个具有参数所指定双精度值的对象。BigDecimal(long) 创建一个具有参数所指定长整数值的对象。BigDecimal(String) 创建一个具有参数所指定以字符串表示的数值的对象。使用valueOf()方法
//使用valueOf方法:BigDecimal b2 = BigDecimal.valueOf(0.48);对于常用的加,减,乘,除,BigDecimal类提供了相应的成员方法。
1 public BigDecimal add(BigDecimal value); //加法2 public BigDecimal subtract(BigDecimal value); //减法 3 public BigDecimal multiply(BigDecimal value); //乘法4 public BigDecimal divide(BigDecimal value); //除法进行相应的计算后,我们可能需要将BigDecimal对象转换成相应的基本数据类型的变量,可以使用floatValue(),doubleValue()等方法。
我们也要注意一个setScale方法,BigDecimal有多种进位方式:①ROUND_UP //远离0的舍入方式②ROUND_DOWN //接近0的舍入方式③ROUND_CEILING //接近正无穷大的舍入方式。④ROUND_FLOOR //接近负无穷大的舍入方式⑤ROUND_HALF_UP //四舍五入⑥ROUND_HALF_DOWN //五舍六入⑦ROUND_HALF_EVEN //银行家舍入法,如果舍弃部分左边的数字为奇数,则作 ROUND_HALF_UP ;如果它为偶数,则作 ROUND_HALF_DOWN 。⑧ROUND_UNNECESSARY //该“伪舍入模式”实际是指明所要求的操作必须是精确的,否则抛出ArithmeticException最后我们封装一个工具类:
package AOP;import java.math.BigDecimal;public class Arith {/** * 提供精确加法计算的add方法 * @param value1 被加数 * @param value2 加数 * @return 两个参数的和 */ public static double add(double value1,double value2){ BigDecimal b1 = new BigDecimal(Double.valueOf(value1)); BigDecimal b2 = new BigDecimal(Double.valueOf(value2)); return b1.add(b2).doubleValue(); } /** * 提供精确减法运算的sub方法 * @param value1 被减数 * @param value2 减数 * @return 两个参数的差 */ public static double sub(double value1,double value2){ BigDecimal b1 = new BigDecimal(Double.valueOf(value1)); BigDecimal b2 = new BigDecimal(Double.valueOf(value2)); return b1.subtract(b2).doubleValue(); } /** * 提供精确乘法运算的mul方法 * @param value1 被乘数 * @param value2 乘数 * @return 两个参数的积 */ public static double mul(double value1,double value2){ BigDecimal b1 = new BigDecimal(Double.valueOf(value1)); BigDecimal b2 = new BigDecimal(Double.valueOf(value2)); return b1.multiply(b2).doubleValue(); } /** * 提供精确的除法运算方法div * @param value1 被除数 * @param value2 除数 * @param scale 精确范围 * @return 两个参数的商 * @throws IllegalAccessException */ public static double div(double value1,double value2,int scale) throws IllegalAccessException{ //如果精确范围小于0,抛出异常信息 if(scale<0){ throw new IllegalAccessException("精确度不能小于0"); } BigDecimal b1 = new BigDecimal(Double.valueOf(value1)); BigDecimal b2 = new BigDecimal(Double.valueOf(value2)); return b1.divide(b2, scale,BigDecimal.ROUND_HALF_UP).doubleValue(); }}
package AOP;import java.math.BigDecimal;public class ArithTest { public static void main(String[] args) throws IllegalAccessException {System.out.println(Arith.add(0.64, 1));System.out.println(Arith.sub(1,0.42));System.out.println(Arith.mul(4.23, 10)); System.out.println(Arith.div(4.12,10,2)); BigDecimal test=new BigDecimal(3.21); System.out.println(test); test=test.setScale(2,BigDecimal.ROUND_DOWN); System.out.println(test); }}
输出:1.64000000000000010.580000000000000142.3000000000000040.413.209999999999999964472863211994990706443786621093753.20
阅读全文
0 0
- BigDecimal
- Bigdecimal
- bigdecimal
- BigDecimal
- BigDecimal
- BigDecimal
- BigDecimal
- BigDecimal
- BigDecimal
- BigDecimal
- BigDecimal
- BigDecimal
- BigDecimal
- BigDecimal
- BigDecimal
- BigDecimal
- BigDecimal
- BigDecimal
- Swift 4.0 字符串(String)学习
- PHP消息队列
- python简洁代码实现快速排序
- Tensorflow 使用slim框架下的分类模型进行分类
- 第九章 Nginx服务器的邮件服务【笔记】
- BigDecimal
- POJ 3280
- opencv——利用轮廓信息画斜矩形、外接圆、拟合直线等
- U盘出现无法访问,文件或目录损坏且无法读取的情况的解决办法。
- 组合聚合区别
- POJ 1811 Prime Test(大素数判断和素因子分解)
- 树莓派3B+ 前世今生
- 【乱搞】BZOJ5074 [Lydsy十月月赛]小B的数字
- Eclipse下SVN插件安装、使用及SVN服务器的搭建