当前位置:网站首页>BigDecimal中除法divide()方法的详细解析,带你走进源码的world
BigDecimal中除法divide()方法的详细解析,带你走进源码的world
2022-07-22 09:21:00 【瓦坎达forever】
进入方法源码之前,按照惯例,了解一下方法都需要知道哪些常量
//设置一个常量=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)的,在进行每一步运算时,都会产生一个新的对象,所以在做加减乘除运算时千万要保存操作后的值。
边栏推荐
- PCV、PIL、Pillow安装
- LeetCode: 620. 有趣的电影
- Unity: 快速定位摄像机Camera
- Leetcode 304. two dimensional area and retrieval - matrix immutable
- STM32+ESP8266+MQTT协议连接OneNet物联网平台
- bjyx
- ps: 如何调出辅助线
- PTA搜索树判断
- The database is garbled. Do you want to find a solution?
- Parameter index out of range (1 &gt; number of parameters, which is 0).
猜你喜欢
ps: 如何调出辅助线
IP, subnet mask, gateway, IPS and IDS
模块TensorFlow中没有Session
bjyx
【QT源代码复用】模拟QCompleter的弹窗方式
Uniapp wechat applet map, open in Gaode app, Tencent app, baidu app, apple map app
05. Law of Demeter LOD
App移動端測試【6】應用程序(apk)包管理與activity
How to resolve errors in executing the yum makecache command
[audio] transplant wm8978 audio codec driver based on STM32 I2S
随机推荐
03. simple responsibility principle
PAT基础习题集7-26 单词长度(精简代码)
LeetCode: 197. 上升的温度
PTA基础题 7-23 币值转换 (20 分) (属实恶心)
1.QTableWidget插入按钮,灵活删除本行,一列显示行号
LeetCode:196. 删除重复的电子邮箱
AMH multiple MySQL versions coexist?
LeetCode 105. 从前序与中序遍历序列构造二叉树
App移動端測試【6】應用程序(apk)包管理與activity
[audio] analysis and summary of PCM audio data transmitted by I2S (I)
华为手机锁定应用
Flink学习笔记(七)处理函数
Go language learning: go language journey (III)
六度空间
消息中间件
SQL injection
02. Dependency Inversion Principle
LeetCode 720. 词典中最长的单词
LeetCode 114. 二叉树展开为链表
Qt | 模态对话框和非模态对话框 QDialog