简介:java.math包含了用于执行基本数学运算的属性和方法,如初等指数、对数、平方根和三角函数。Math 的方法都被定义为 static 形式,通过 Math 类可以在主函数中直接调用。
环境准备:
1)系统环境windows10 64bit pro;
2)开发环境jdk8;
3)开发工具idea;
4)创建一个常规Java项目;
5)将src.zip导入;
6)首先看一下(翻译)包信息说明;
/**
*提供用于执行任意精度整数的类
*算术({@code BigInteger})和任意精度的十进制
*算术({@code BigDecimal})。{@code BigInteger}与之类似
*除了提供任意
*精度,因此{@code BigInteger}上的操作不会溢出
*或者失去精确性。除了标准的算术运算,
*{@code BigInteger}提供了模运算,GCD计算,
*素性测试,素数生成,位操作,等等
*其他杂项业务。
*
*{@code BigDecimal}提供任意精度的带符号十进制数
*适用于货币计算等的数字。{@代码
*BigDecimal}让用户完全控制取整行为,
*允许用户从一个全面的八个集合中进行选择
*舍入模式。
*
*@自JDK1.1以来
*/
6-1)BigDecimal(java.math.BigDecimal)
不可变的、任意精度的有符号十进制数。BigDecimal 由任意精度的整数非标度值 和 32 位的整数标度 (scale) 组成。
如果为零或正数,则标度是小数点后的位数。如果为负数,则将该数的非标度值乘以 10 的负 scale 次幂。因此,BigDecimal 表示的数值是unscaledValue × 10^(-scale)。
提供以下操作:算术、标度操作、舍入、比较、哈希算法和格式转换。
可以通过两种类型的操作来处理 BigDecimal 的标度:标度/舍入操作和小数点移动操作。标度/舍入操作(setScale 和 round)返回BigDecimal,其值近似地(或精确地)等于操作数的值,但是其标度或精度是指定的值;即:它们会增加或减少对其值具有最小影响的存储数的精度。小数点移动操作(movePointLeft 和 movePointRight)返回从操作数创建的 BigDecimal,创建的方法是按指定方向将小数点移动一个指定距离。
BigDecimal 的自然排序与 equals 方法不一致。
6-2)BigInteger(java.math.BigInteger)
不可变的任意精度的整数。所有操作中,都以二进制补码形式表示 BigInteger(如 Java 的基本整数类型)。
提供Math下的方法、模算术、GCD 计算、质数测试、素数生成、位操作等。
6-3)BitSieve(java.math.BigSieve)
字节过滤类。
6-4)MathContext(java.math.MahContext)
该对象是封装上下文设置的不可变对象,它描述数字运算符的某些规则。比如数据的精度,舍入方式等等。
6-5)MutableBigInteger(java.math.MutableBigInteger)
可变的BigInteger。
6-6)RoundingMode(java.math.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。 |
举例:
图片源引自https://www.cnblogs.com/chenyq/p/5129408.html
6-7)SignedMuableBigInteger(java.math.SignedMuableBigInteger)
有符号的可变的BigInteger。
7)常用方法
/**
* 保留两位小数
*/
BigDecimal bigNum = new BigDecimal("传入的参数");
bigNum.setScale(2, BigDecimal.ROUND_HALF_UP);
/**
* 减法运算
*/
BigDecimal bigNumFirst = new BigDecimal("被减数");
BigDecimal bigNumSecond = new BigDecimal("减数");
bigNumFirst.subtract(bigNumSecond);
/**
* 加法运算
*/
BigDecimal bigNumFirst = new BigDecimal("被加数");
BigDecimal bigNumSecond = new BigDecimal("加数");
bigNumFirst.add(bigNumSecond);
/**
* 乘法运算
*/
BigDecimal bigNumFirst = new BigDecimal("被乘数");
BigDecimal bigNumSecond = new BigDecimal("乘数");
bigNumFirst.multiply(bigNumSecond);
/**
* 除法运算
*/
BigDecimal bigNumFirst = new BigDecimal("被除数");
BigDecimal bigNumSecond = new BigDecimal("除数");
// 精度 不能小于0
int scale = 10;
bigNumFirst.divide(bigNumSecond, scale, BigDecimal.ROUND_HALF_UP);