📓
Be a Javaer
  • Introduction
  • 第 1 章 Java编程开发入门
    • 第 1 节 Java开发准备
    • 第 2 节 Java基本概念
    • 第 3 节 Java数据类型划分
    • 第 4 节 Java运算符
    • 第 5 节 Java程序逻辑控制
    • 第 6 节 Java方法的定义及使用
  • 第 2 章 Java面向对象编程
    • 第 1 节 类与对象
    • 第 2 节 深入分析类与对象
    • 第 3 节 数组的定义与使用
    • 第 4 节 String类的基本概念
    • 第 5 节 String类的常用方法
    • 第 6 节 this关键字
    • 第 7 节 引用传递
    • 第 8 节 数据表与简单Java类映射
    • 第 9 节 对象比较
    • 第 10 节 static关键字
    • 第 11 节 代码块
    • 第 12 节 内部类
    • 第 13 节 链表的定义与使用
    • 第 14 节 继承性
    • 第 15 节 覆写
    • 第 16 节 数组操作
    • 第 17 节 辅助概念
      • final关键字
      • 多态性
    • 第 18 节 抽象类的定义及使用
    • 第 19 节 接口的定义及使用
    • 第 20 节 Object类
    • 第 21 节 拓展概念
      • 匿名内部类
      • 包装类
    • 第 22 节 包的定义及使用
    • 第 23 节 访问控制权限
      • 单例设计模式
      • 多例设计模式
    • 第 24 节 异常的捕获及处理
    • 第 25 节 Java5新特性
      • 可变参数
      • foreach循环
      • 静态导入
    • 第 26 节 泛型
    • 第 27 节 枚举
    • 第 28 节 Annotation
    • 第 29 节 Java7新特性
      • AutoCloseable
      • Try-with-resources
    • 第 30 节 Java8新特性
      • 接口定义增强
      • Lambda表达式
      • 方法引用
      • 函数式接口
  • 第 3 章 Java高级编程
    • 第 1 节 Java多线程基础实现
    • 第 2 节 线程常用操作方法
    • 第 3 节 线程的同步与死锁
    • 第 4 节 生产者与消费者
    • 第 5 节 Java基础类库
      • StringBuffer
      • Runtime
      • System
      • finalize
      • Cleaner
      • 对象克隆
    • 第 6 节 数字操作类
      • Math类
      • Random类
      • 大数字操作类
    • 第 7 节 日期处理类
      • Date类
      • 日期格式化
      • Calendar类
    • 第 8 节 比较器
    • 第 9 节 正则表达式
      • 常用的正则标记
      • String类对正则的支持
      • java.util.regex包支持
    • 第 10 节 反射机制
    • 第 11 节 动态代理
    • 第 12 节 反射与Annotation
    • 第 13 节 国际化程序实现
    • 第 14 节 开发支持类库
      • Arrays类
      • UUID类
      • Optional类
      • ThreadLocal类
      • 定时器
      • Base64加密工具
    • 第 15 节 文件操作
    • 第 16 节 字节流与字符流
    • 第 17 节 IO辅助概念
      • 字符编码
      • 内存流
      • 管道流
      • RandomAccessFile
    • 第 18 节 打印流
    • 第 19 节 System类对IO的支持
    • 第 20 节 对象序列化
    • 第 21 节 IO高级应用
      • 缓冲输入流
      • Scanner
    • 第 22 节 网络编程
    • 第 23 节 类集框架
    • 第 24 节 List集合
    • 第 25 节 集合输出
    • 第 26 节 Map集合
    • 第 27 节 Set集合
    • 第 28 节 集合工具类
      • Stack
      • Queue
      • Properties
      • Collections工具类
    • 第 29 节 数据流Stream
    • 第 30 节 JDBC简介
    • 第 31 节 Statement接口
    • 第 32 节 PreparedStatment接口
    • 第 33 节 批处理与事务处理
  • 第 4 章 Oracle数据库基础
    • 第 1 节 Oracle简介
    • 第 2 节 Oracle安装与配置
    • 第 3 节 SQLPlus命令
    • 第 4 节 SQL简介与数据表分析
    • 第 5 节 SQL简单查询
    • 第 6 节 SQL限定查询
    • 第 7 节 查询排序
    • 第 8 节 综合练习:基础查询
    • 第 9 节 单行函数
    • 第 10 节 多表查询
    • 第 11 节 分组统计查询
    • 第 12 节 子查询
    • 第 13 节 综合案例:复杂查询
    • 第 14 节 数据更新操作
    • 第 15 节 事务处理
    • 第 16 节 数据伪列
    • 第 17 节 数据表的创建与管理
    • 第 18 节 约束的创建与管理
    • 第 19 节 综合案例:数据表操作
    • 第 20 节 序列的定义与使用
  • 第 5 章 JavaWeb基础
  • 第 6 章 走向单体地狱
  • 第 7 章 GitFlow工作流指南
    • 版本控制
    • Git
    • 集中式工作流
    • 功能分支工作流
    • GitFlow 工作流
    • Forking 工作流
    • Pull Requests
  • 第 8 章 微服务入门
    • 第 1 节 微服务简介
    • 第 2 节 Linux
    • 第 3 节 Docker
    • Docker 仓库
    • Ubuntu 安装 Docker
    • Docker 镜像加速器
    • 第 4 节 Docker Compose
    • 第 5 节 GitLab
    • 第 6 节 Nexus
    • 第 7 节 Harbor
  • 第 9 章 再谈微服务
  • 第 10 章 Spring Boot
  • 第 11 章 Spring Cloud Netflix
  • 第 12 章 Apache Dubbo Zookeeper
  • 第 13 章 Spring Cloud Alibaba
  • 第 14 章 Vue
  • 第 15 章 Kubernetes
  • 第 16 章 Spring Security oAuth2
  • 第 17 章 Flutter
  • Redis
    • Redis 入门
    • Redis 的数据类型
    • Redis 事务
    • Jedis
    • Spring Boot 整合 Redis
    • Redis 配置文件
    • Redis 持久化
    • Redis 发布/订阅
    • Redis 主从复制
    • Redis Sentinel
    • Redis 缓存故障
  • Glossary
由 GitBook 提供支持
在本页
  • Math类
  • Random类
  • 大数字操作类
  • 总结

这有帮助吗?

  1. 第 3 章 Java高级编程

第 6 节 数字操作类

上一页第 5 节 Java基础类库下一页第 7 节 日期处理类

最后更新于5年前

这有帮助吗?

Math类

Math就是一个专门进行数学计算的操作类,里面提供了一系列的数学计算方法。

在Math类里面提供的一切方法都是static型的方法,因为Math类里面没有普通属性。

Math类中有这样的一个方法:

  • 四舍五入:public static long round(double a)。

范例: 观察四舍五入

public class MainClass{ 
	public static void main(String[] args) throws Exception {
		System.out.println(Math.round(15.5)); // 16
		System.out.println(Math.round(-15.5)); // -15
		System.out.println(Math.round(-15.51)); // -16
	}
}

如果进行负数四舍五入的时候,操作的数据小数位大于0.5才进位,小于等于0.5不进位。

Random类

这个类的主要功能是取得随机数的操作类。

范例: 产生10个不大于100的正整数(0~99)

public class MainClass{ 
	public static void main(String[] args) throws Exception {
		Random random = new Random();
		for (int i = 0; i < 10; i ++) {
			System.out.print(random.nextInt(100) + "、");
		}
	}
}

既然Random可以产生对技术,下面就希望利用其来实现一个36选7的功能。

范例: 36选7

public class MainClass{ 
	public static void main(String[] args) throws Exception {
		Random random = new Random();
		int[] date = new int[7]; // 开辟一个7个元素的数组
		int foot = 0; // 此为数组操作交表
		while (foot < 7) { // 不知道多少次循环可以保存完数据,所以使用while循环
			int t = random.nextInt(37); // 生成一个不大于37的随机数
			if (!isRepeat(date, t)) { // 重复
				date[foot ++] = t; // 保存数据
			}
		}
		Arrays.sort(date);
		for (int i = 0; i < date.length; i ++) {
			System.out.print(date[i] + ", ");
		}
	}
	/**
	 * 此方法主要是判断是否存在有重复的内容,但是不允许保存0
	 * @param temp 指的是已经保存的数据
	 * @param num 新生成的数据
	 * @return 如果成功的保存了,那么返回true,否者返回false
	 */
	public static boolean isRepeat(int[] temp, int num) {
		if (num == 0) { // 没有必要向下继续判断
			return true;
		}
		for (int i = 0; i < temp.length; i ++) {
			if (temp[i] == num) {
				return true;
			}
		}
		return false;
	}
}

在很多的开发之中随机数都一定会有。

大数字操作类

如果说现在要操作的数字值很大,那么首先想到的应该是double,那么如果说现在计算的结果超过了double该如何接收这个数据。

public class MainClass{ 
	public static void main(String[] args) throws Exception {
		System.out.println(Double.MAX_VALUE * Double.MAX_VALUE); // Infinity
	}
}

现在发现此时的计算结果并不存在,因为已经超过了double的范畴。

**面试题:**请问当前假设有两个很大的数字进行数学计算(超过double范围),你给怎么做?

如果真的超过了double的范围,那么肯定无法用double进行保存,只有String才可以准确的保存好这个数据。如果真的需要对很大的数据进行计算,只能够将其变为String型,而后按位取出每一个字符保存的数据,进行手工的计算。

所以在Java里面考虑到了此类情况,专门提供了大数字的操作类,其中就有BigInteger、BigDecimal两种。

BigInteger

BigInteger类的构造方法:public BigInteger(String val),它接受的是String型。

public class MainClass{ 
	public static void main(String[] args) throws Exception {
		BigInteger biga = new BigInteger("894165498148168684618");
		BigInteger bigb = new BigInteger("48154687351354698415");
		System.out.println("加法操作:" + biga.add(bigb));
		System.out.println("减法操作:" + biga.subtract(bigb));
		System.out.println("乘法操作:" + biga.multiply(bigb));
		System.out.println("除法操作:" + biga.divide(bigb));
		// 数组里面只有两个元素:第一个元素表示的是商,第二个元素表示的是余数
		BigInteger[] result = biga.divideAndRemainder(bigb);
		System.out.println("商:" + result[0] + ",余数:" + result[1]);
	}
}

在Java里面虽然提供了大数字的操作类,但是很多的时候,我们对于数字的精度要求可能会更高,所以Java本身提供的数字类实际意义并不大。

BigDecimal两种

BigInteger不能保存小数,而BigDecimal可以保存小数。在BigDecimal类里面提供有如下的构造:

  • 构造一:public BigDecimal(String val);

  • 构造二:public BigDecimal(double val)。

与BigInteger一样,BigDecimal本身也支持基础的数学计算。可是使用BigDecimal还有一个非常重要的目的:就是可以利用它来实现准确的四舍五入操作。

之前使用过Math.round()实现过四舍五入操作,但是这种操作有一个问题,所有的小数位都四舍五入了。遗憾的是BigDecimal类里面没有直接提供有四舍五入的操作支持,可以利用除法计算实现:

  • 除法操作:public BigDecimal divide(BigDecimal divisor, int scale, int roundingMode)

    • BigDecimal divisor:被除数;

    • int scale:保留的小数位;

    • int roundingMode:进位模式(public static final int ROUND_HALF_UP)。

范例: 实现准确的四舍五入

class MyMath {
	/**
	 * 实现准确位数的四舍五入操作
	 * @param num 要进行四舍五入的数字
	 * @param scale 要保留的小数位
	 * @return 处理后的四舍五入数据
	 */
	public static double round(double num, int scale) {
		BigDecimal biga = new BigDecimal(num);
		BigDecimal bigb = new BigDecimal(1);
		return biga.divide(bigb, scale, BigDecimal.ROUND_HALF_UP).doubleValue();
	}
}
public class MainClass{ 
	public static void main(String[] args) throws Exception {
		System.out.println(MyMath.round(19.79469494, 2));
		System.out.println(MyMath.round(-15.5, 0));
		System.out.println(MyMath.round(15.5, 0));
	}
}

总结

  1. Math类重点要清楚round()方法的机制;

  2. Random类生成随机数;

  3. 如果数据量大就使用BigInteger或BigDecimal,这两个类是Number的子类。

Math类
Random类
大数字操作类