欢迎光临散文网 会员登陆 & 注册

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

2020-05-28 11:24 作者:玩游戏的程序猿  | 我要投稿

本篇内容仅面向小白,如有错误,请指正。

本篇为原创,转载请注明出处。

初学编程,大家都知道,我们把小数叫做浮点数,浮点数分为单精度浮点数(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。

使用多个损失了精度的小数进行运算,它们损失的精度可能会累加。

C#代码
C#代码

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

小数转为二进制代码

调用方法及结果:

调用


[编程小白]小数的精度是如何损失的?的评论 (共 条)

分享到微博请遵守国家法律