Math 类
常用方法
Math
java .lang .math类,封装了很多与数学相关的属性和方法。使用它可以再一定程度上避免程序员自行研发数学方面
常用方法
常量
1.static double E
比任何其他值都接近的e(自然对数的底数)的double值
2.static double PI
比任何其他值都更接近pi(圆的周长与直径之比)的double值
方法
1. static 数据类型 abs(数据类型 参数)
返回参数对应数据类型的绝对值数据类型有int ,float,double,long
2.static double random()
生成[0,1)之间的随机小数,想要生成a-b之间的数,用返回值*b+a
即:random()*b + a;
3.static double ceil(double d);
向上取整,无论小数点后面是否满足四舍五入的条件都要向前进一位。负数向0取整。
4. static double floor(double d);
向下取整,无论小数点后面是否满足四舍五入的条件,小数点后面的数都舍弃。
负数想更小的值向下取整。
5. static long round(double d);
四舍五入,返回接近参数的long值
6. static int round(float a);
四舍五入,返回接近参数的int值
7. static double pow(double a, double b):
求a 的 b 次幂,不精确。
public static double pow(double a, double b){
return StrictMath.pow(a,b);
}
底层源码:public static native double pow(double a, double b);
8.double sqrt(double a):开平方
System.out.println(Math.sqrt(4));//2.0
9.double cbrt(double a):开立方
System.out.println(Math.cbrt(27));//3.0
BigDecimal类 解决小数计算不精确问题
不可变的、任意精度的有符号十进制数。BigDecimal 由任意精度的整数非标度值 和 32 位的整数标度 (scale) 组成。如果为零或正数,则标度是小数点后的位数。如果为负数,则将该数的非标度值乘以 10 的负 scale 次幂。
构造方法
BigDecimal的构造方法有很多,此处只写常用的。
常用:
推荐使用 BigDecimal(String val);精度精确,double类型的形参会导致更加不精确
-
BigDecimal(String val)
将 BigDecimal 的字符串表示形式转换为 BigDecimal。
不推荐:
-
BigDecimal(double val)
将 double 转换为 BigDecimal,后者是 double 的二进制浮点值准确的十进制表示形式。
常用方法
-
1.BigDecimal add(BigDecimal augend) ; 加法
返回一个 BigDecimal,其值为 (this + augend),其标度为 max(this.scale(), augend.scale())。 -
2.BigDecimal subtract(BigDecimal b) 减法
-
3.BigDecimal multiply(BigDecimal b) 乘法
-
4.BigDecimal divide(BigDecimal b) 除法,除不尽的时候会报算术异常。ArithmeticException
-
5.解决方案是:使用重载的divide()方法。
BigDecimal divide(BigDecimal b, int scale, BigDecimal ROUNDE_HALF_UP);第一个参数是除数,第二个参数是保留小数位数,第三个参数是舍入模式
package JAVA_API.num6_Math;
/**
* java.lang.Math类,封装了很多与数学相关的属性和方法,使用它可以在一定程度避免程序员自行研发数学方面的代码
* 都是静态常量和静态方法。方便直接调用类名.调用
*
* Math中的静态常量:圆周率 PI 科学计数法:E
* Math中的静态方法:
* 1.求绝对值: static int abs(int a); 返回一个int型参数的绝对值
* 2.求最大值或最小值: static int max(int a,int b); / static int min(int a,int b);
* 求两个数中的最大值和最小值,只能比较两个数之间大小,多了不好使,仅限类型int,long double ,float
* 3.生成随机数:static double random(); 返回一个带正号的double值,该值在[0.0 - 1.0)之间的随机小数,若要生成[a,b)之间的数,则用返回值*b+a:ramdom()*b + a;
* 4.向上取整:static double ceil(double d)向上取整,无论小数点后面是否满足四舍五入的条件都要向前进一位。负数向0取整。
* 5. 向下取整 double floor(double d) ,向下取整 ,无论小数点后面是否满足四舍五入的条件,小数点后面的数都舍弃。
* 负数想更小的值向下取整。
* 6.static long round(double d);四舍五入,返回接近参数的long值
* 7.static double pow(double a, double b); 求 a 的 b次幂
* 8.static double sqrt(double a):开平方
* 9.static double cbrt(double a);开立方
* @author yyc
* 2021/9/14 9:25
*/
public class MathDemo1 {
public static void main(String[] args) {
//Math中的静态常量
//PI
System.out.println(Math.PI);
//科学计数法
System.out.println(Math.E);
//Math中的静态方法
/*求绝对值
* 1. static int abs(int a); 返回一个int型参数的绝对值
* */
System.out.println(Math.abs(-1));//1
System.out.println(Math.abs(-1.9));//1.9
/*
* 2.static int max(int a,int b)/ static int min(int a,int b):求两个数中的最大值和最小值,
* 只能比较两个数之间大小,多了不好使,仅限类型int,long double ,float
* */
System.out.println(Math.max(2,3));
System.out.println(Math.max(-1.2, 0.3));//0.3
/*
* 3.double random();生成[0.0,1.0)之间的随机数,若想控制小数位数,可以自行编码控制
* */
System.out.println(Math.random()*100+1);//28.97085122980648
/*
负数向右即是向上取整:
* 4.向上取整:double ceil(double d);无论小数点后面是否满足四舍五入的条件都要向前进一位。负数向0取整。
* */
System.out.println(Math.ceil(2.23));//3.0
/*
负数向左即是向下取整
* 5.向下取整 double floor(double d) ,向下取整 ,无论小数点后面是否满足四舍五入的条件,小数点后面的数都舍弃。
* 负数想更小的值向下取整。
* */
System.out.println(Math.floor(-3.3));//-4.0
System.out.println(Math.floor(-3.9));//-4.0
/*
* 6.static long round() :四舍五入,返回值是long类型。
* static int round(float a) :返回int类型
* static long round(double a):返回long类型
* */
System.out.println(Math.round(2.35));//2
System.out.println(Math.round(2.5));//3
/*
* 7.static double pow(double a, double b):求a的b次幂
* */
System.out.println(Math.pow(2,3));//8.0
System.out.println(Math.pow(1.1,3));//1.3310000000000004不精确,
/*
底层源码:
public static double pow(double a, double b) {
return StrictMath.pow(a, b); // default impl. delegates to StrictMath
}
* public static native double pow(double a, double b);
* */
/*
* 8.double sqrt(double a):开平方
* */
System.out.println(Math.sqrt(9));//3.0
System.out.println(Math.sqrt(12.25));//3.5
/*
* 9.static double cbrt(double a):开立方
* */
System.out.println(Math.cbrt(27));//3.0
}
}
###BigDecimal 类的练习代码
package JAVA_API.num6_Math;
import java.math.BigDecimal;
import java.util.Scanner;
/**
* @author yyc
* 2021/9/15 13:46
*/
public class BigDecimalDemo {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
System.out.println("请输入两个小数:");
double a = scan.nextDouble();//2.1
double b = scan.nextDouble();//-2.1
System.out.println(a+b);//0.0
System.out.println(a-b);//4.2
System.out.println(a*b);//-4.41
System.out.println(a/b);//-1.0
//创建BigDecimal对象
//BigDecimal(double a);使用double值创建BigDecimal对象进行计算作比较
/* BigDecimal b1 = new BigDecimal(a);//2.1
BigDecimal b2 = new BigDecimal(b);//-2.1
System.out.println(b1.add(b2));//0E-51,不精确
*/
//为避免double 自身不精确问题,使用String类型形参创建BigDecimal对象,
// 将double转成String,可以直接拼接空串"",也可以使用valueOf()
BigDecimal b1 = new BigDecimal(a+"");
BigDecimal b2 = new BigDecimal(b+"");
//调用方法进行计算:
//1.BigDecimal add(BigDecimal b);加法
System.out.println(b1.add(b2));//0.0
//2.BigDecimal subtract(BigDecimal b) 减法
//3.BigDecimal multiply(BigDecimal b) 乘法
//4.BigDecimal divide(BigDecimal b) 除法,除不尽的时候会报算术异常。ArithmeticException
//5.解决方案是:使用重载的divide()方法。
//BigDecimal divide(BigDecimal b, int scale, BigDecimal ROUNDE_HALF_UP);第一个参数是除数,第二个参数是保留小数位数,第三个参数是舍入模式
System.out.println(b1.divide(b2,2,BigDecimal.ROUND_HALF_UP));// 10 / 3 = 3.33
}
}