Java double 类型数据类型精度问题BigDecimal

**********************************

double类型精度问题

**********************************

复制代码
 1 package test;
 2 import java.math.BigDecimal;
 3 
 4 public class TestBigDecimal
 5 {
 6     public static void main(String[] args) 
 7     {
 8         double v1=0.12;
 9         BigDecimal b1 = new BigDecimal(Double.toString(v1));
10         
11         BigDecimal f1 = new BigDecimal("0.05");
12         BigDecimal f2 = BigDecimal.valueOf(0.01);
13         BigDecimal f3 = new BigDecimal(0.05);
14         System.out.println("下面使用String作为BigDecimal构造器参数的计算结果:");
15         System.out.println("0.05 + 0.01 = " + f1.add(f2));
16         System.out.println("0.05 - 0.01 = " + f1.subtract(f2));
17         System.out.println("0.05 * 0.01 = " + f1.multiply(f2));
18         System.out.println("0.05 / 0.01 = " + f1.divide(f2));
19         System.out.println("下面使用double作为BigDecimal构造器参数的计算结果:");
20         System.out.println("0.05 + 0.01 = " + f3.add(f2));
21         System.out.println("0.05 - 0.01 = " + f3.subtract(f2));
22         System.out.println("0.05 * 0.01 = " + f3.multiply(f2));
23         System.out.println("0.05 / 0.01 = " + f3.divide(f2));
24     }
25 }
复制代码

 

 

 

 

 

 

 

 **********************************

 转载:https://blog.csdn.net/u011277123/article/details/95774544

float 符号位(1bit) 指数(8 bit) 尾数(23 bit)

double 符号位(1bit) 指数(11 bit) 尾数(52 bit)

float在内存中占8位,由于阶码实际存储的是指数的移码,假设指数的真值是e,阶码为E,则有E=e+(2^n-1 -1)。其中 2^n-1 -1是IEEE754标准规定的指数偏移量,根据这个公式我们可以得到 2^8 -1=127。于是,float的指数范围为-128 +127,而double的指数范围为-1024 +1023。其中负指数决定了浮点数所能表达的绝对值最小的非零数;而正指数决定了浮点数所能表达的绝对值最大的数,也即决定了浮点数的取值范围。

loat的范围为-2^128 ~ +2^127,也即-3.40E+38 ~ +3.40E+38;

double的范围为-2^1024 ~ +2^1023,也即-1.79E+308 ~ +1.79E+308

 

 

计算机在处理数据都涉及到数据的转换和各种复杂运算,比如,不同单位换算,不同进制(如二进制十进制)换算等,很多除法运算不能除尽,比如10÷3=3.3333.....无穷无尽,而精度是有限的,3.3333333x3并不等于10,

经过复杂的处理后得到的十进制数据并不精确,精度越高越精确。float和double的精度是由尾数的位数来决定的,其整数部分始终是一个隐含着的“1”,由于它是不变的,故不能对精度造成影响。float:2^23 = 8388608,一共七位,

由于最左为1的一位省略了,这意味着最多能表示8位数: 28388608 = 16777216 。有8位有效数字,但绝对能保证的为7位,也即float的精度为7~8位有效数字;double:2^52 = 4503599627370496,一共16位,同理,double的精度为16~17位

 

 

 

 当到达一定值自动开始使用科学计数法,并保留相关精度的有效数字,所以结果是个近似数,并且指数为整数。

在十进制中小数有些是无法完整用二进制表示的。所以只能用有限位来表示,从而在存储时可能就会有误差。

对于十进制的小数转换成二进制采用乘2取整法进行计算,取掉整数部分后,剩下的小数继续乘以2,直到小数部分全为0。

 **********************************

 

 

 

 

 

 

 

 

 

 

 

 因为BigInteger与BigDecimal都是不可变的(immutable)的,在进行每一步运算时,都会产生一个新的对象,所以a.add(b);虽然做了加法操作,但是a并没有保存加操作后的值,正确的用法应该是a=a.add(b);

 

 

 

______________________________________________________

复制代码
 1 package test;
 2 
 3 public class TestWhat {
 4 
 5     public static void main(String[] args) {
 6         // TODO 自动生成的方法存根
 7         int X=100;
 8         int Y=200;
 9         System.out.println("X+Y="+X+Y);
10         System.out.println(X+Y+"=X+Y");
11     }
12 
13 }
复制代码

 

 

 

 

 

 =======================================

明天学会类的使用!

 

posted @   靠谱杨  阅读(488)  评论(0编辑  收藏  举报
编辑推荐:
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具

喜欢请打赏

扫描二维码打赏

了解更多

点击右上角即可分享
微信分享提示