这里将自己学习java及其应用的一些笔记、积累分享一下,如果涉及到了文章、文字侵权,请联系我删除或调整。
一、BigDecimal、BigInteger
1.1 概述
- BigDecimal 做精确的浮点数运算
- BigInteger 做超大的整数运算
1.2 创建对象
- BigDecimal.valueOf(2.0)
- BigInteger.valueOf(2)
1.3 BigDecimal方法
- add(BigDecimal bd) ,加法
- subtract(BigDecimal bd) ,减法
- multiply(BigDecimal bd) ,乘法
- divide(BigDecimal bd) ,除法
- divide(BigDecimal bd,保留位数,舍入方式) ,自定义精确度等的除法
- setScale(保留位数,舍入方式) ,设置精确度、舍入方式
ROUND_HALF_UP 五入
ROUND_HALF_DOWN 五舍
ROUND_UP 直接进位
ROUND_DOWN 直接舍弃
ROUND_CEILING 向上取整
ROUND_FLOOR 向下取整
ROUND_EVEN 公平取舍:靠近较小整数,则取小;靠近较大整数,则取大;位于中间,则取最近的偶数
1.4 练习:BigDecimal
package bigdecimaltest;
import java.math.BigDecimal;
import java.util.Scanner;
public class Test1 {
public static void main(String[] args) {
System.out.println("请输入两个数:");
System.out.println("不精确计算--------------------------------------------");
Double a = new Scanner(System.in).nextDouble();
Double b = new Scanner(System.in).nextDouble();
System.out.println(a+b);
System.out.println(a-b);
System.out.println(a*b);
System.out.println(a/b);
System.out.println("精确计算-------------------------------------------");
BigDecimal c = BigDecimal.valueOf(a);
BigDecimal d = BigDecimal.valueOf(b);
BigDecimal e = c.add(d);
System.out.println(e.doubleValue());
e = c.subtract(d);
System.out.println(e.doubleValue());
e = c.multiply(d);
System.out.println(e.doubleValue());
e = c.divide(d,50,BigDecimal.ROUND_HALF_UP);
/* ROUND_HALF_UP 五入
* ROUND_HALF_DOWN 五舍
*
* ROUND_UP 直接进位
* ROUND_DOWN 直接舍弃
*
* ROUND_CEILING 向上取整
* ROUND_FLOOR 向下取整
*
* ROUND_EVEN 公平取舍:靠近较小整数,则取小;靠近较大整数,则取大;位于中间,则取最近的偶数
*/
System.out.println(e.doubleValue());// 由于double类型小数位有限,所以无法显示50位
System.out.println(e.toString());// 以BigDecimal类类型直接输出,则可以显示50位小数
e = e.setScale(2,BigDecimal.ROUND_HALF_UP); // 利用setScale方法,对结果进行小数保留并输出
System.out.println(e.doubleValue());
}
}
1.5 练习:BMI指数,利用BigDecimal来进行精确计算
package bmi;
import java.math.BigDecimal;
/*BIM指数
**/
import java.util.Scanner;
public class Test1 {
public static void main(String[] args) {
// 定义Scanner对象,以便后续读取键盘输入
Scanner sc = new Scanner(System.in);
System.out.println("体重:");
double w = sc.nextDouble();
System.out.println("身高:");
double h = sc.nextDouble();
// 调用f()方法,根据 BMI = W / h*h
// 因为遍历作用域,w,h是main的局部变量,离开{}则无效
f(w,h);
sc.close();
}
static void f(double w, double h){
// double BMI = w / (h*h);
// 利用BigDecimal来进行精确计算
BigDecimal ww = BigDecimal.valueOf(w);
BigDecimal hh = BigDecimal.valueOf(h);
// .pow(n) 求对象的n次幂
double BMI = ww.divide(
hh.pow(2),
1,
BigDecimal.ROUND_HALF_UP).doubleValue();
String str = "";
System.out.println("BIM指数 = "+ BMI);
if(BMI < 18.5){
str = "过轻";
}else if(BMI<= 22.9){
str = "正常";
}else if(BMI <= 24.9){
str = "偏胖";
}else if(BMI <= 29.9){
str = "肥胖";
}else if(BMI <= 40){
str = "重度肥胖";
}else{
str = "极度偏胖";
}
System.out.println("您的体重属于:"+str);
}
}
1.6 练习:阶乘,利用BigInteger类扩展阶乘的运算范围,可以进行更大数字的阶乘运算
package jiecheng;
import java.math.BigInteger;
import java.util.Scanner;
/*阶乘*/
public class Test1 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("请输入与一个整数");
int n = sc.nextInt();
sc.close();
// 调用f()方法,计算阶乘
f(n);
}
private static void f(int n) {
// 利用BigInteger类扩展阶乘的运算范围,可以进行更大数字的阶乘运算
BigInteger r = BigInteger.valueOf(n);
if (r.longValue() < 0) {
System.out.println("无");
return;
}
if (r.longValue() == 0) {
System.out.println("0 的阶乘 = 1");
return;
}
// i是int类型,需要对其进行封装为BigInteger
for(int i = 1; i < n; i++){
r = r.multiply(BigInteger.valueOf(i));
}
System.out.println("n的阶乘=" + r.toString());
}
}