当前位置:网站首页>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
边栏推荐
- 排错-关于clion not found visual studio 的问题
- mysql如何使用JSON_EXTRACT()取json值
- Redis+caffeine two-level cache enables smooth access speed
- Cartoon: how to multiply large integers? (integrated version)
- Force deduction solution summary 729- my schedule I
- CMake教程Step1(基本起点)
- winedt常用快捷键 修改快捷键latex编译按钮
- Debug kernel code through proc interface
- 解读:如何应对物联网目前面临的安全问题?
- 查看自己电脑连接过的WiFi密码
猜你喜欢

云主机oracle异常恢复----惜分飞

CVPR 2022 best student paper: single image estimation object pose estimation in 3D space

CVPR 2022最佳学生论文:单张图像估计物体在3D空间中的位姿估计

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

Machine learning 01: Introduction

Count the running time of PHP program and set the maximum running time of PHP

Which is more cost-effective, haqu K1 or haqu H1? Who is more worth starting with?

Oracle recovery tools -- Oracle database recovery tool

MySQL之知识点(七)

企业数字化发展中的六个安全陋习,每一个都很危险!
随机推荐
CMake教程Step2(添加库)
基于Redis实现延时队列的优化方案小结
Using C language to realize palindrome number
机器学习02:模型评估
How to write a full score project document | acquisition technology
統計php程序運行時間及設置PHP最長運行時間
CMake教程Step6(添加自定义命令和生成文件)
提高應用程序性能的7個DevOps實踐
7 pratiques devops pour améliorer la performance des applications
Learn about MySQL transaction isolation level
Judge whether a string is a full letter sentence
ThoughtWorks global CTO: build the architecture according to needs, and excessive engineering will only "waste people and money"
Force deduction solution summary 729- my schedule I
CMake教程Step4(安装和测试)
漫画:如何实现大整数相乘?(下)
漫画:有趣的【海盗】问题
How MySQL uses JSON_ Extract() takes JSON value
Vulnerability recurrence - 48. Command injection in airflow DAG (cve-2020-11978)
云安全日报220705:红帽PHP解释器发现执行任意代码漏洞,需要尽快升级
排错-关于clion not found visual studio 的问题