为什么大部分小数在计算机中是不准确的

思考:数字在计算机中是以那种方式储存的

答案:是以二进制的形式在计算机中储存的。

问:为什么大部分小数在计算机中是不准确的?有没有例外?

例如:写一个number类

package number类;
    //写一个number类
public class number{
    public static void main(String[] args) {
		double a = 1.3;
		double b = 2.3;
		System.out.println(a+b);
	}
}

浮点数类型的 a 和 b 相加控制台打印结果:

在这里插入图片描述

想一下:为什么计算机算出来的结果和我们运算的不一样呢?

答案不应该是3.6吗 ???接下来——让我们带着问题来看一下

扩展一下:

计算机之所以叫 “计算” 机就是因为发明它主要是用来计算的,“计算” 当然是它的特长,在大家的印象中,计算一定是非常准确的。但实际上,在一些非常基本的小数运算中,计算的结果是不精确的。那是因为计算机的计算方式和我们不一样,我们学的叫做高级语言,而计算机只认识机器语言,计算机的运算方式需要把我们的高级语言转换为机器语言(0-1的方式)再进一步进行运算的出结果。


让我们一起逐步运算看一下计算机是怎么运算的~~
运算解析:

1.3转为二进制:

整数部分1转为二进制是0001;

小数部分是:
0 1 0 0 1 1 0

0.3 * 2=0.6、 0.6 * 2=1.2、 0.2 * 2=0.4 、 0.4 * 2=0.8、 0.8 * 2=1.6、 0.6 * 2=1.2、 0.2*2=0.4
0 1 1 0

0.4 * 2=0.8、 0.8 * 2=1.6、 0.6 * 2=1.2 、 0.2 * 2=0.4

由此可以看出1.3这是一个无限循环的二进制:

0001.0100110011001100110011

2.3转为二进制:

整数部分转二进制:0010

小数部分转二进制:
0 1 0 0 1 1

0.6 * 2=1.2、 0.2 * 2=0.4、 0.4 * 2=0.8 、 0.8 * 2=1.6、 0.6 * 2=1.2

0 0 1 1 0 0

0.2 * 2=0.4、 0.4 * 2=0.8 、 0.8 * 2=1.6 、 0.6 * 2=1.2、 0.2 * 2=0.4 、 0.4 * 2=0.8

由此可以看出2.3这也是一个无限循环的二进制:

0010.0100110011001100110011

二进制相加:因为是正数 所以三码合一 直接相加

0001.0100110011001100110011

​ + // 上下小数二进制相加

0010.0100110011001100110011

————相加的结果如下————

二进制: 0011.10011…

结果: 3.599999…

解析:

大多小数转换为二进制和它们相似,小数点后面都是无限循环小数,所以计算机进行计算的时候只会得到近似值而不是准确值的原因了。
但是,也有个别特殊小数不同(比如:0.125)它进行二进制转换之后得到的是整数。

例外:

0.125转为二进制:(整数部分为0不用转)

小数部分转二进制:

​0.125 * 2 = 0.25 0.25 * 2 = 0.5 0.5 * 2 = 1.0

最后1.0移除1以后成为0,0乘以任何数都为0,结束

所以0.125对应的二进制数为0.001,这是一个准确的二进制数,不是近似值。
好了我们的问题到这里也解决了!
答案:👇👇👇

所以大部分浮点数在计算机中是不准确的。 唯独0.125是个例外!!!

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值