zoukankan      html  css  js  c++  java
  • 为什么浮点型运算结果会有误差?

    如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来获得结果。

  • 相关阅读:
    Java实现数字密码发生器
    Java实现夺冠概率模拟
    Java实现夺冠概率模拟
    Java实现夺冠概率模拟
    java 消息机制 ActiveMQ入门实例
    关于Java String 类型转换时null的问题(转)
    实现quartz定时器及quartz定时器原理介绍(转)
    spring 定时任务的 执行时间设置规则
    Spring与Quartz的整合实现定时任务调度(转)
    python开源项目及示例代码(转)
  • 原文地址:https://www.cnblogs.com/xiaoan0705/p/11221463.html
Copyright © 2011-2022 走看看