当前位置:网站首页>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
边栏推荐
- Rider 设置选中单词侧边高亮,去除警告建议高亮
- [7.7 live broadcast preview] the lecturer of "typical architecture of SaaS cloud native applications" teaches you to easily build cloud native SaaS applications. Once the problem is solved, Huawei's s
- 企业数字化发展中的六个安全陋习,每一个都很危险!
- 【二叉树】根到叶路径上的不足节点
- 基于Redis实现延时队列的优化方案小结
- 2022年信息系统管理工程师考试大纲
- Zhang Ping'an: accelerate cloud digital innovation and jointly build an industrial smart ecosystem
- IDEA 项目启动报错 Shorten the command line via JAR manifest or via a classpath file and rerun.
- Independent development is a way out for programmers
- Server configuration jupyter environment
猜你喜欢

IDC报告:腾讯云数据库稳居关系型数据库市场TOP 2!

ICML 2022 | Meta提出鲁棒的多目标贝叶斯优化方法,有效应对输入噪声

提高應用程序性能的7個DevOps實踐

Kafaka技术第一课

Alpha conversion from gamma space to linner space under URP (II) -- multi alpha map superposition

winedt常用快捷键 修改快捷键latex编译按钮

Three traversal methods of binary tree

33: Chapter 3: develop pass service: 16: use redis to cache user information; (to reduce the pressure on the database)

Rider set the highlighted side of the selected word, remove the warning and suggest highlighting

stirring! 2022 open atom global open source summit registration is hot!
随机推荐
Database design in multi tenant mode
ThoughtWorks global CTO: build the architecture according to needs, and excessive engineering will only "waste people and money"
In depth understanding of redis memory obsolescence strategy
Summary of optimization scheme for implementing delay queue based on redis
How MySQL uses JSON_ Extract() takes JSON value
CVPR 2022 best student paper: single image estimation object pose estimation in 3D space
Example tutorial of SQL deduplication
Domain name resolution, reverse domain name resolution nbtstat
CMake教程Step5(添加系统自检)
Which is more cost-effective, haqu K1 or haqu H1? Who is more worth starting with?
C#实现水晶报表绑定数据并实现打印3-二维码条形码
[7.7 live broadcast preview] the lecturer of "typical architecture of SaaS cloud native applications" teaches you to easily build cloud native SaaS applications. Once the problem is solved, Huawei's s
数据访问 - EntityFramework集成
To solve the problem of "double click PDF file, pop up", please install Evernote program
Cmake tutorial step6 (add custom commands and generate files)
普通程序员看代码,顶级程序员看趋势
Read the history of it development in one breath
c#图文混合,以二进制方式写入数据库
Is it safe and reliable to open futures accounts on koufu.com? How to distinguish whether the platform is safe?
Humi analysis: the integrated application of industrial Internet identity analysis and enterprise information system