与数学相关的三个常用类
Math 类:Math类包含执行基本数字运算的方法,如基本指数,对数,平方根和三角函数。都是静态方法,使用不多.
BigDecimal 类:float和double都不能表示精确的小数,此时使用 BigDecimal类,用于处理金钱和精度要求高的数据.
BigInteger 类:表示大整型,如果两个long类型的最大值相运算,结果long再也存储不下,此时使用BigInteger,一般不用.
一、Math 类
有两个常量
方法等:
|
返回值为 |
|
返回大于或等于参数的最小(最接近负无穷大) |
|
返回小于或等于参数的最大(最接近正无穷大) |
|
返回两个 |
|
返回两个 |
|
返回值为 |
|
返回与参数最接近值的 |
|
返回参数中最接近的 |
|
返回参数中最接近的 |
测试 demo
public static void main(String[] args) {
/**
* Math.abs(); 求绝对值
* 参数支持:double float 和int
*/
System.out.println("绝对值:" + Math.abs(-10.5)); // 10.5
System.out.println("绝对值:" + Math.abs(10.4)); // 10.4
/**
* Math.max(); 求最大值
* Math.min(); 求最小值
* 参数支持:double float long和int
* */
System.out.println("最大值:" + Math.max(100L, 99L)); // 100
System.out.println("最小值:" + Math.min(-10.5f, -10.4f)); // -10.5
/**
* Math.ceil(); 天花板的意思,返回向上取整数(取最大值)
*/
System.out.println("值:" + Math.ceil(-10.1)); // -10
System.out.println("值:" + Math.ceil(10.1)); // 11
/**
* Math.floor(); 地板的意思,返回向下取整数(取最小值)
*/
System.out.println("值:" + Math.floor(-10.1)); // -11
System.out.println("值:" + Math.floor(10.1)); // 10
/**
* Math.random(); 返回一个在 [0,1) 内的随机数double值
*/
System.out.println("[0,1)值:" + Math.random()); // 0.5498044946067191
System.out.println("[49,100)值:" + (Math.random() * 51 + 49)); // 78.0217677789672
/**
* Math.rint(); 四舍五入
* 返回double值
*/
System.out.println("四舍五入值:" + Math.rint(-10.5)); // -10.0
System.out.println("四舍五入值:" + Math.rint(-10.51)); // -11
System.out.println("四舍五入值:" + Math.rint(10.4)); // 10.0
/**
* Math.round() 四舍五入
* float时返回int值,double时返回long值
*/
System.out.println("四舍五入值:" + Math.round(-10.5)); // -10
System.out.println("四舍五入值:" + Math.round(-10.51)); // -11
System.out.println("四舍五入值:" + Math.round(10.4f)); // 10
}
二、BigDecimal 类
Java 中提供了大数字(超过16位有效位)的操作类,即 java.math.BinInteger 类和 java.math.BigDecimal 类,用于高精度计算。其中:
BigInteger 类是针对大 整数的处理类,而 BigDecimal 类则是针对大 小数的处理类.
BigDecimal 类的实现用到了 BigInteger类,不同的是 BigDecimal 加入了小数的概念.
float 和 Double 只能用来做科学计算或者是工程计算;在商业计算中,对数字精度要求较高,必须使用 BigInteger 类和 BigDecimal 类,它支持任何精度的定点数,可以用它来精确计算货币值.
BigDecimal 类创建的是对象,不能使用传统的+、-、*、/等算术运算符直接对其进行数学运算,而必须调用其对应的方法。方法的参数也必须是BigDecimal类型的对象.
1、构造 BigDecimal 对象常用方法
注意:
1)double 参数的构造方法,不允许使用!因为它不能精确的得到相应的值,值会变大;
2)String 构造方法是完全可预知的: 写入 new BigDecimal("0.1") 将创建一个 BigDecimal,它正好等于预期的0.1; 因此,通常建议优先使用 String 构造方法;
3) 静态方法 valueOf(double val) 内部实现,仍是将 double 类型转为 String 类型; 这通常是将 double(或float)转化为 BigDecimal 的首选方法;
4) BigDecimal 类 覆写了 toString 方法
public static void main(String[] args) {
double d1 = 0.1;
double d2 = 100.1;
// 此方式绝对不允许使用!
System.out.println(new BigDecimal(d1)); // 0.1000000000000000055511151231257827021181583404541015625
System.out.println(new BigDecimal(d2)); // 100.099999999999994315658113919198513031005859375
System.out.println(new BigDecimal("0.1")); // 0.1
System.out.println(new BigDecimal("100.0"));// 100.1
BigDecimal b1 = BigDecimal.valueOf(d1); // 0.1
BigDecimal b2 = BigDecimal.valueOf(d2); // 100.1
System.out.println(b1); // 0.1
System.out.println(b2); // 100.1
System.out.println(new BigDecimal(String.valueOf(d1))); // 0.1
System.out.println(new BigDecimal(String.valueOf(d2))); // 100.1
System.out.println(new BigDecimal(Double.toString(d1))); // 0.1
System.out.println(new BigDecimal(Double.toString(d2))); // 100.1
}
1、简单加减乘等计算方法
public static void main(String[] args) {
double d1 = 0.2;
double d2 = 100.2;
BigDecimal b1 = BigDecimal.valueOf(d1); // 0.2
BigDecimal b2 = BigDecimal.valueOf(d2); // 100.2
/**
* 精确计算
*/
System.out.println(b1.add(b2)); // 加法 100.4
System.out.println(b1.subtract(b2)); // 减法 -100.0
System.out.println(b1.multiply(b2)); // 乘法 20.04
System.out.println(b1.remainder(b2)); // 0.2
System.out.println(b1.max(b2)); // 最大数 100.2
System.out.println(b1.min(b2)); // 最小数 0.2
System.out.println(b1.abs()); // 绝对值 0.2
System.out.println(b1.negate()); // 相反数 -0.2
}
2、除法常用方法
|
返回一个 |
|
返回一个 |
舍入模式(BigDecimal 类 静态字段):
常用的小学中的四舍五入:ROUND_HALF_UP
RoundingMode 其实是个枚举类,点进去源码可以看到其实他就是匹配到几种取舍规则
public enum RoundingMode {
UP(BigDecimal.ROUND_UP),
DOWN(BigDecimal.ROUND_DOWN),
CEILING(BigDecimal.ROUND_CEILING),
FLOOR(BigDecimal.ROUND_FLOOR),
HALF_UP(BigDecimal.ROUND_HALF_UP),
HALF_DOWN(BigDecimal.ROUND_HALF_DOWN),
HALF_EVEN(BigDecimal.ROUND_HALF_EVEN),
UNNECESSARY(BigDecimal.ROUND_UNNECESSARY);
...
}
测试 demo
public static void main(String[] args) {
double d1 = 0.22;
double d2 = 10.0;
BigDecimal b1 = BigDecimal.valueOf(d1); // 0.22
BigDecimal b2 = BigDecimal.valueOf(d2); // 10.0
/**
* 精确计算 10 除 0.22 == 45.45454545454545
*/
/**
* ROUND_UP: 总是在非 0 舍弃小数(即截断)之前增加数字(向上取整)。
* ROUND_DOWN: 从不在舍弃(即截断)的小数之前增加数字(向下取整)。
*/
System.out.println("ROUND_UP:" + b2.divide(b1, 3, BigDecimal.ROUND_UP)); // 45.455
System.out.println("ROUND_DOWN:" + b2.divide(b1, 3, BigDecimal.ROUND_DOWN )); // 45.454
/**
* ROUND_HALF_UP: 若舍弃部分>=.5,则作 ROUND_UP ;否则,作 ROUND_DOWN 。(小学中的四舍五入)
* ROUND_HALF_DOWN: 若舍弃部分> .5,则作 ROUND_UP;否则,作 ROUND_DOWN 。
*/
System.out.println("ROUND_HALF_UP:" + b2.divide(b1, 3, BigDecimal.ROUND_HALF_UP)); // 45.455
System.out.println("ROUND_HALF_DOWN::" + b2.divide(b1, 3, BigDecimal.ROUND_HALF_DOWN));// 45.455
/**
* ROUND_CEILING: 如果 BigDecimal 是正的,则做 ROUND_UP 操作;如果为负,则做 ROUND_DOWN 操作。
* ROUND_FLOOR: 如果BigDecimal为正,则表现为ROUND_DOWN ; 如果为负,表现为ROUND_UP 。
*/
System.out.println("ROUND_CEILING:" + b2.divide(b1, 3, BigDecimal.ROUND_CEILING)); // 45.455
System.out.println("ROUND_FLOOR:" + b2.divide(b1, 3, BigDecimal.ROUND_FLOOR)); // 45.454
/**
* ROUND_HALF_EVEN: 如果舍弃部分左边的数字为奇数,则作 ROUND_HALF_UP ;如果它为偶数,则作 ROUND_HALF_DOWN 。
* ROUND_UNNECESSARY: 该“伪舍入模式”实际是指明所要求的操作必须是精确的,因此不需要舍入。
* 如果在产生不精确结果的操作上指定了舍入模式,则抛出ArithmeticException 。
*/
System.out.println("ROUND_HALF_EVEN:" + b2.divide(b1, 3, BigDecimal.ROUND_HALF_EVEN)); // 45.455
// System.out.println("ROUND_UNNECESSARY:" + b2.divide(b1, 3, BigDecimal.ROUND_UNNECESSARY)); //
/**
* RoundingMode 枚举类型一样
*/
BigDecimal divide = b2.divide(b1, 3, RoundingMode.HALF_UP);
System.out.println("RoundingMode.HALF_UP:" + divide); // 加法 45.455
}
三、BigInteger 类
BigInteger 类是针对大 整数的处理类,而 BigDecimal 类则是针对大 小数的处理类。一般使用不多,用法同 BigDecimal 类似。这里就不测试啦。
BigInteger 类使用参考文章:Java中BigInteger类的使用方法详解
ends ~