Java学习笔记(27)——BigDecimal、BigInteger

这里将自己学习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());
	}
}

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值