前言
相信大家在学习编程语言的变量类型的浮点数的时候,都有听说过“浮点数的精度是有限的”,即0.1+0.2不等于0.3,那么究竟是为什么呢?
其实这个问题非常简单,只要我们转换一下视角就可以了。我们之所以知道 0.1+0.2=0.3,是因为我们使用的是十进制,而计算机判断他们不相等,根本原因是因为计算机使用的是二进制。
十进制小数转化成二进制
首先我们要知道我们使用的十进制,在二进制的计算机世界中是怎么样的。已经知道如何转换的同学可以直接跳过这部分。
十进制的整数部分和小数部分转化成二进制的方法是不一样的,十进制整数转二进制使用的是「除 2 取余法」,十进制小数使用的是「乘 2 取整法」。
十进制 8.625 转化为二进制就是 1000.101,即 2^3 + 2^-1 + 2^-3 = 8+0.5+0.125
。
其实二进制小数并不能表示所有的小数,只能表达2 除尽的数字,比如 1/2=0.1,1/4=0.01,3/4=0.11,1/8=0.001;而像0.1,0.2,0.3这种小数,就不能用二进制完整表示(就像十进制无法精确表示1/3,1/7一样),所以使用二进制的计算机碰上这种小数,只能尽其所能表示,也就出现了精度问题。
计算机是怎么存小数的-浮点数
1000.101
这种表达是「定点数」形式,代表着小数点是固定的,不能移动,如果你移动了它的小数点,这个数就被改变了。
然而,计算机并不是这样存储的小数的,计算机存储小数的采用的是浮点数,表示小数点是可以浮动的。
比如 1000.101