当前位置:网站首页>Accuracy of BigDecimal Division
Accuracy of BigDecimal Division
2022-07-05 17:34:00 【Full stack programmer webmaster】
Hello everyone , I meet you again , I'm your friend, Quan Jun .
BigDecimal The accuracy of division
In the use of BigDecimal Division time , Encounter a ghost animal problem , The accuracy of this calculation , Result use return 0, Of course, I finally found that my posture was wrong , So record , Avoid repeating the mistakes later
I. Ask questions
In the use of BigDecimal When doing high-precision Division , I encountered a small problem when I didn't pay attention , as follows
@Test
public void testBigDecimal() {
BigDecimal origin = new BigDecimal(541253);
BigDecimal now = new BigDecimal(12389431);
BigDecimal val = origin.divide(now, RoundingMode.HALF_UP);
System.out.println(val);
origin = new BigDecimal(541253);
now = new BigDecimal(12389431.3);
val = origin.divide(now, RoundingMode.HALF_UP);
System.out.println(val);
origin = new BigDecimal(541253.4);
now = new BigDecimal(12389431);
val = origin.divide(now, RoundingMode.HALF_UP);
System.out.println(val);
}
Copy code
What is the output above ?
0
0
0.043686703610520937021487456961257
Copy code
Why are the first two 0 Well , If it's directly 541253 / 12389431
= 0 It's understandable , however BigDecimal Isn't it a high-precision calculation , To be reasonable, there should not be such a problem of division
We know that BigDecimal When triggering , You can specify parameters to keep decimals , If you add this , Will it be different ?
BigDecimal origin = new BigDecimal(541253);
BigDecimal now = new BigDecimal(12389431);
BigDecimal val = origin.divide(now, 5, RoundingMode.HALF_UP);
System.out.println(val);
Copy code
The output is :
0.04369
Copy code
So after the decimal point is specified , No problem , So make a bold guess , Is it some of the above case in , because scale When the value is not specified , The default values are different , Which leads to different accuracy of the final result ?
Simple in-depth source code analysis , The way of execution is origin.divide(now, RoundingMode.HALF_UP);
, So this scale Parameters are aimed origin object , And this object , We can only analyze its structure , Because there is no other place to use
II. Source location
1. Shaping parameter transmission structure
Analyze the following line , Go straight to source
BigDecimal origin = new BigDecimal(541253);
Copy code
The obvious int Pass parameter structure , Go in and have a brief look
// java.math.BigDecimal#BigDecimal(int)
public BigDecimal(int val) {
this.intCompact = val;
this.scale = 0;
this.intVal = null;
}
public BigDecimal(long val) {
this.intCompact = val;
this.intVal = (val == INFLATED) ? INFLATED_BIGINT : null;
this.scale = 0;
}
Copy code
so, Clearly know the default scale by 0, That is to say, when origin Positive number , Division with it , Unrealistic designation scale When parameters are , The final returns are all without decimals , Take the same look , also long The way of transmitting reference , BigInteger It's the same thing
2. Floating point parameter transfer
The next step is floating point scale The default value confirms , This structure is a little more complex than the previous one , Source code is not posted , Too long , I don't quite understand what I did , Directly in a more obscene way , Get into debug Pattern , Step by step
@Test
public void testBigDecimal() {
BigDecimal origin = new BigDecimal(541253.0);
BigDecimal now = new BigDecimal(12389431.1);
BigDecimal tmp = new BigDecimal(0.0);
}
Copy code
according to debug Result , first ,scale by 0; the second scale by 29, Third scale by 0
3. String The ginseng
It's still a bunch of logic , Also use one-step debug Try... In a different way
@Test
public void testBigDecimal() {
BigDecimal origin = new BigDecimal("541253.0");
BigDecimal now = new BigDecimal("12389431.1");
BigDecimal t = new BigDecimal("0.0");
}
Copy code
The top three scale All are 1
4. Summary
- about BigDecimal In Division , It is best to specify its scale Parameters , Or there might be a hole
- about BigDecimla Of scale The principle of initialization , Need to take a closer look BigDecimal How did it happen
II. other
1. A gray Blog: https://liuyueyi.github.io/hexblog
A grey personal blog , Keep a record of all the blogs in your study and work , Welcome to visit
2. Statement
Better to believe than to believe , What has been said , It's all in one family , Because of limited personal ability , There are inevitably omissions and mistakes , If found bug Or better advice , Welcome criticism and correction , Thank you very much
Publisher : Full stack programmer stack length , Reprint please indicate the source :https://javaforall.cn/149837.html Link to the original text :https://javaforall.cn
边栏推荐
- Beijing internal promotion | the machine learning group of Microsoft Research Asia recruits full-time researchers in nlp/ speech synthesis and other directions
- 忽米沄析:工业互联网标识解析与企业信息系统的融合应用
- MYSQL group by 有哪些注意事项
- Winedt common shortcut key modify shortcut key latex compile button
- What are the precautions for MySQL group by
- Example tutorial of SQL deduplication
- 蚂蚁金服的暴富还未开始,Zoom的神话却仍在继续!
- 【二叉树】根到叶路径上的不足节点
- MySql 查询符合条件的最新数据行
- 求解为啥all(())是True, 而any(())是FALSE?
猜你喜欢
Beijing internal promotion | the machine learning group of Microsoft Research Asia recruits full-time researchers in nlp/ speech synthesis and other directions
Mongodb (quick start) (I)
Use of ThinkPHP template
基于Redis实现延时队列的优化方案小结
网络威胁分析师应该具备的十种能力
MySQL queries the latest qualified data rows
统计php程序运行时间及设置PHP最长运行时间
7 pratiques devops pour améliorer la performance des applications
Rider set the highlighted side of the selected word, remove the warning and suggest highlighting
CVPR 2022 best student paper: single image estimation object pose estimation in 3D space
随机推荐
IDC报告:腾讯云数据库稳居关系型数据库市场TOP 2!
Sentinel-流量防卫兵
Read the basic grammar of C language in one article
The five most difficult programming languages in the world
Cartoon: how to multiply large integers? (next)
winedt常用快捷键 修改快捷键latex编译按钮
漫画:一道数学题引发的血案
SQL删除重复数据的实例教程
Debug kernel code through proc interface
Read the history of it development in one breath
C (WinForm) the current thread is not in a single threaded unit, so ActiveX controls cannot be instantiated
Flow characteristics of kitchen knife, ant sword, ice scorpion and Godzilla
Oracle Recovery Tools ----oracle数据库恢复利器
Database design in multi tenant mode
Ant financial's sudden wealth has not yet begun, but the myth of zoom continues!
How to save the trained neural network model (pytorch version)
世界上最难的5种编程语言
Cmake tutorial step6 (add custom commands and generate files)
Short the command line via jar manifest or via a classpath file and rerun
查看自己电脑连接过的WiFi密码