小数在计算机中不精确

这篇博客探讨了Java中float类型的存储方式,包括符号位、指数位和尾数位的分配。指出由于小数在二进制下存在无限循环,如0.1转换为二进制的过程,导致计算机无法精确表示某些小数。因此,大部分小数在计算机中存在精度损失的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

我们先来了解一下小数在java是如何储存的

1.一个浮点数有3部分组成:符号位,指数位和尾数位。

2.float类型符号位占1位,指数部分占用8bit(1个字节)的二进制数,可表示数值范围为0-255,尾数占23位,但是因为规格化表示,小数点左边的就是最高位一定为1,最高位省去不存储,在存储中占23bit,实际有24位精度。

3.但凡学过数学就应该知道正常除法很多整数除以三都是除不尽的,在计算机中大概也是这样。

比如说0.1

把0.1转换成二进制

计算过程:
0.1*2=0.2……0——整数部分为“0”。整数部分“0”清零后为“0”,用“0.2”接着计算。
0.2*2=0.4……0——整数部分为“0”。整数部分“0”清零后为“0”,用“0.4”接着计算。
0.4*2=0.8……0——整数部分为“0”。整数部分“0”清零后为“0”,用“0.8”接着计算。
0.8*2=1.6……1——整数部分为“1”。整数部分“1”清零后为“0”,用“0.6”接着计算。
0.6*2=1.2……1——整数部分为“1”。整数部分“1”清零后为“0”,用“0.2”接着计算。
0.2*2=0.4……0——整数部分为“0”。整数部分“0”清零后为“0”,用“0.4”接着计算。
0.4*2=0.8……0——整数部分为“0”。整数部分“0”清零后为“0”,用“0.8”接着计算。
0.8*2=1.6……1——整数部分为“1”。整数部分“1”清零后为“0”,用“0.6”接着计算。
0.6*2=1.2……1——整数部分为“1”。整数部分“1”清零后为“0”,用“0.2”接着计算。
0.2*2=0.4……0——整数部分为“0”。整数部分“0”清零后为“0”,用“0.4”接着计算。
0.4*2=0.8……0——整数部分为“0”。整数部分“0”清零后为“0”,用“0.2”接着计算。
0.8*2=1.6……1——整数部分为“1”。整数部分“1”清零后为“0”,用“0.2”接着计算。

.......

得到的整数依次是:“0”,“0”,“0”,“1”,“1”,“0”,“0”,“1”,“1”,“0”,“0”,“1”……
大家肯定能看出来,整数部分出现了无限循环。

这种情况计算机也没办法精确的计算了。

所以大部分小数在计算机中是没办法精确计算的。

就这样,知道是无法精确计算的就行了。

老板让你精确计算直接给他一个大嘴巴子,让他给你算一个看看。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值