BigDecimal中除法divide()方法的详细解析,带你走进源码的world

2024-03-25 21:59

本文主要是介绍BigDecimal中除法divide()方法的详细解析,带你走进源码的world,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

进入方法源码之前,按照惯例,了解一下方法都需要知道哪些常量

//设置一个常量=0,判断用
public final static int ROUND_UP =           0;
//设置一个常量=7,判断用
public final static int ROUND_UNNECESSARY =  7;
//整型数字表示的BigDecimal,例a的intCompact值为122
private final transient long intCompact;
//Long类型的最小长度
static final long INFLATED = Long.MIN_VALUE;
//方法的第二个参数,指小数位位数
private final int scale;

以下是divde方法的方法体
在这里插入图片描述

 public BigDecimal divide(BigDecimal divisor, int scale, int roundingMode) {//如果第三个参数传过来的值小于0或者大于7,抛出异常"Invalid rounding mode"if (roundingMode < ROUND_UP || roundingMode > ROUND_UNNECESSARY)throw new IllegalArgumentException("Invalid rounding mode");//只要被除数不等于Long类型的最小值if (this.intCompact != INFLATED) {//除数的值不等于Long类型最小值if ((divisor.intCompact != INFLATED)) {//进入divide的方法return divide(this.intCompact, this.scale, divisor.intCompact, divisor.scale, scale, roundingMode);} else {//除数的值等于Long类型最小值return divide(this.intCompact, this.scale, divisor.intVal, divisor.scale, scale, roundingMode);}} else {//被除数等于Long类型的最小值//除数的值不等于Long类型最小值if ((divisor.intCompact != INFLATED)) {return divide(this.intVal, this.scale, divisor.intCompact, divisor.scale, scale, roundingMode);} else {//除数的值等于Long类型最小值return divide(this.intVal, this.scale, divisor.intVal, divisor.scale, scale, roundingMode);}}}

根据以上情况,势必会出现四种方法
被除数是long类型 除数是BigDecimal类型的
被除数是BigDecimal类型 除数是long类型的
被除数是long类型 除数是long类型的
被除数是BigDecimal类型 除数是BigDecimal类型的

总结

    (1)数字敏感计算使用BigDecimal。(2)尽量使用参数类型为String的构造函数。(3) BigDecimal都是不可变的(immutable)的,在进行每一步运算时,都会产生一个新的对象,所以在做加减乘除运算时千万要保存操作后的值。

这篇关于BigDecimal中除法divide()方法的详细解析,带你走进源码的world的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


原文地址:https://blog.csdn.net/cssnnd/article/details/107916505
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.chinasem.cn/article/846367

相关文章

Linux系统中查询JDK安装目录的几种常用方法

《Linux系统中查询JDK安装目录的几种常用方法》:本文主要介绍Linux系统中查询JDK安装目录的几种常用方法,方法分别是通过update-alternatives、Java命令、环境变量及目... 目录方法 1:通过update-alternatives查询(推荐)方法 2:检查所有已安装的 JDK方

SQL Server安装时候没有中文选项的解决方法

《SQLServer安装时候没有中文选项的解决方法》用户安装SQLServer时界面全英文,无中文选项,通过修改安装设置中的国家或地区为中文中国,重启安装程序后界面恢复中文,解决了问题,对SQLSe... 你是不是在安装SQL Server时候发现安装界面和别人不同,并且无论如何都没有中文选项?这个问题也

Java Thread中join方法使用举例详解

《JavaThread中join方法使用举例详解》JavaThread中join()方法主要是让调用改方法的thread完成run方法里面的东西后,在执行join()方法后面的代码,这篇文章主要介绍... 目录前言1.join()方法的定义和作用2.join()方法的三个重载版本3.join()方法的工作原

2025版mysql8.0.41 winx64 手动安装详细教程

《2025版mysql8.0.41winx64手动安装详细教程》本文指导Windows系统下MySQL安装配置,包含解压、设置环境变量、my.ini配置、初始化密码获取、服务安装与手动启动等步骤,... 目录一、下载安装包二、配置环境变量三、安装配置四、启动 mysql 服务,修改密码一、下载安装包安装地

在macOS上安装jenv管理JDK版本的详细步骤

《在macOS上安装jenv管理JDK版本的详细步骤》jEnv是一个命令行工具,正如它的官网所宣称的那样,它是来让你忘记怎么配置JAVA_HOME环境变量的神队友,:本文主要介绍在macOS上安装... 目录前言安装 jenv添加 JDK 版本到 jenv切换 JDK 版本总结前言China编程在开发 Java

MySQL CTE (Common Table Expressions)示例全解析

《MySQLCTE(CommonTableExpressions)示例全解析》MySQL8.0引入CTE,支持递归查询,可创建临时命名结果集,提升复杂查询的可读性与维护性,适用于层次结构数据处... 目录基本语法CTE 主要特点非递归 CTE简单 CTE 示例多 CTE 示例递归 CTE基本递归 CTE 结

Spring Boot Actuator应用监控与管理的详细步骤

《SpringBootActuator应用监控与管理的详细步骤》SpringBootActuator是SpringBoot的监控工具,提供健康检查、性能指标、日志管理等核心功能,支持自定义和扩展端... 目录一、 Spring Boot Actuator 概述二、 集成 Spring Boot Actuat

如何在Java Spring实现异步执行(详细篇)

《如何在JavaSpring实现异步执行(详细篇)》Spring框架通过@Async、Executor等实现异步执行,提升系统性能与响应速度,支持自定义线程池管理并发,本文给大家介绍如何在Sprin... 目录前言1. 使用 @Async 实现异步执行1.1 启用异步执行支持1.2 创建异步方法1.3 调用

Spring Boot 3.x 中 WebClient 示例详解析

《SpringBoot3.x中WebClient示例详解析》SpringBoot3.x中WebClient是响应式HTTP客户端,替代RestTemplate,支持异步非阻塞请求,涵盖GET... 目录Spring Boot 3.x 中 WebClient 全面详解及示例1. WebClient 简介2.

在MySQL中实现冷热数据分离的方法及使用场景底层原理解析

《在MySQL中实现冷热数据分离的方法及使用场景底层原理解析》MySQL冷热数据分离通过分表/分区策略、数据归档和索引优化,将频繁访问的热数据与冷数据分开存储,提升查询效率并降低存储成本,适用于高并发... 目录实现冷热数据分离1. 分表策略2. 使用分区表3. 数据归档与迁移在mysql中实现冷热数据分