本文共 7448 字,大约阅读时间需要 24 分钟。
Math 类:Math类包含执行基本数字运算的方法,如基本指数,对数,平方根和三角函数。都是静态方法,使用不多.
BigDecimal 类:float和double都不能表示精确的小数,此时使用 BigDecimal类,用于处理金钱和精度要求高的数据.
BigInteger 类:表示大整型,如果两个long类型的最大值相运算,结果long再也存储不下,此时使用BigInteger,一般不用.
有两个常量
方法等:
static double | (double a) 返回值为 |
static double | (double a) 返回大于或等于参数的最小(最接近负无穷大) |
static double | (double a) 返回小于或等于参数的最大(最接近正无穷大) |
static float | (float a, float b) 返回两个 |
static int | (int a, int b) 返回两个 |
static double | () 返回值为 |
static double | (double a) 返回与参数最接近值的 |
static long | (double a) 返回参数中最接近的 |
static int | (float a) 返回参数中最接近的 |
测试 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 }
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、除法常用方法
| ( divisor, int scale, int roundingMode) 返回一个 |
| ( divisor, int scale, roundingMode) 返回一个 |
舍入模式(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 类是针对大 整数的处理类,而 BigDecimal 类则是针对大 小数的处理类。一般使用不多,用法同 BigDecimal 类似。这里就不测试啦。
BigInteger 类使用参考文章:
ends ~
转载地址:http://cncgn.baihongyu.com/