我是靠谱客的博主 活泼苗条,最近开发中收集的这篇文章主要介绍为什么浮点型运算结果会有误差?,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

如var a=0.65;

 var b=0.6;   

    console.log(a-b)==0.05???错   a-b=0.050000000000000044

为什么?

其根本原因在于计算机所使用的01代码无法准确地表示某些带小数的十进制数据。

下面我们来分析下:

  我们知道将一个十进制数值转换为二进制数值,需要通过下面的计算方法:

  1. 整数部分:连续用该整数除以2,取余数,然后商再除以2,直到商等于0为止。然后把得到的各个余数按相反的顺序排列。简称"除2取余法"。

  2. 小数部分:十进制小数转换为二进制小数,采用"乘2取整,顺序排列"法。用2乘以十进制小数,将得到的整数部分取出,再用2乘余下的小数部分,然后再将积的整数部分取出,如此进行,直到积中的小数部分为0或者达到所要求的精度为止。然后把取出的整数部分按顺序排列起来,即先取出的整数部分作为二进制小数的高位,后取出的整数部分作为低位有效位。简称"乘2取整法"。

  3. 含有小数的十进制数转换成二进制,整数、小数部分分别进行转换,然后相加。

  例如:将十进制数值25.75转换为二进制数值,步骤如下:

  25(整数部分)

  25/2=12......1

  12/2=6.......0

  6/2=3......0

  3/2=1......1

  1/2=0......1

  (25) 10=(11001) 2

  0.75(小数部分)

  0.75*2=1.5......1

  0.5*2=1......1

  (0.75) 10=(0.11) 2

  (25.75) 10=(11001) 2+(0.11) 2=(11001.11) 2

 

  按照上述方法,我们将0.65及0.6转换为二进制代码:

  (0.65)10 = (0.101001100110011001100110011001100110011......)2

  (0.6) 10 = (0.10011001100110011001100110011001100110011......)2

  后面的省略号表示已经算不完了,后面在无限重复 0011 这段二进制数值。

 

  因为浮点型只能存储32位,所以会进行截取,截取后的二进制代码已无法准确表示0.65和0.6,所以无法得到正确的结果

  解决方法:因为二进制数可以准确表示整数,所以可以先将小数乘10或100等变成整数,然后做运算,最后再通过除以10或100来获得结果。

转载于:https://www.cnblogs.com/xiaoan0705/p/11221463.html

最后

以上就是活泼苗条为你收集整理的为什么浮点型运算结果会有误差?的全部内容,希望文章能够帮你解决为什么浮点型运算结果会有误差?所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(51)

评论列表共有 0 条评论

立即
投稿
返回
顶部