思考:数字在计算机中是以那种方式储存的
答案:是以二进制的形式在计算机中储存的。
问:为什么大部分小数在计算机中是不准确的?有没有例外?
例如:写一个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是个例外!!!