[编程小白]小数的精度是如何损失的?

本篇内容仅面向小白,如有错误,请指正。
本篇为原创,转载请注明出处。
初学编程,大家都知道,我们把小数叫做浮点数,浮点数分为单精度浮点数(Float)和双精度浮点数(Double),不管是什么精度,在计算机里面都是以二进制的方式存储的。
要想知道精度为什么损失,我们先要知道浮点数是如何转为二进制的。
举个例子,把10.4转为二进制,步骤是这样的:
一、整数部分转为二进制:
①取整数部分10,除以2,得5,余数是0,这个0是整数部分最右边一位,即0
②将上一步的商再除以2:5÷2=2……1,这个余数是整数部分右边第二位,即10
③重复第②步,把得到的余数依次写到左边,直到商为0。最终得到结果:1010

二、转换小数:
①先把整数部分转为二进制,再加上小数点:1010.
②取小数部分乘以2:0.4×2=0.8
③取上面结果的整数部分,拼接到结果中:1010.0
④重复第②③步,直到小数部分变为0

最后我们得到了一个无限循环小数:1010.01100110011001100110011……
但是我们知道,计算机中浮点数是有位数限制的,Float是32位,Double是64位,而上面转换之后的小数是无限位数的,所以存储的时候会舍弃后面的小数,这就导致了小数的精度损失。当然了,保留的位数越多,损失的精度越小,所以说Double精度更高,但是使用的资源也更多。如果对精度要求不那么高,也可以选Float。
使用多个损失了精度的小数进行运算,它们损失的精度可能会累加。


附:数字转为二进制代码:

调用方法及结果:
