为了账号安全,请及时绑定邮箱和手机立即绑定

javascirpt 为什么 0.3-0.2结果不准确

javascirpt 为什么 0.3-0.2结果不准确

jeck猫 2019-03-14 17:15:46
javascirpt 为什么 0.3-0.2,0.3-0.1结果不准确,js还有哪些诸如此类的bug,另外用vue写股票实时数据这种页面除了定时器获取数据渲染页面,还有什么好的方法
查看完整描述

5 回答

?
人到中年有点甜

TA贡献1895条经验 获得超7个赞

  1. 因为 js 里面浮点数运算不是 100% 精确的,解决方法:以你给的例子可以 (0.3 * 10 + 0.2 * 10) / 10,即先转换成整数

  2. 很多语言在设计上都会有一定的缺陷,有的是设计失误,有的是折中取舍。你可以搜索下 js 缺陷 陷阱 等关键字,会找到你想要的

  3. 可以使用 websocket,让服务器推送


查看完整回答
反对 回复 2019-03-21
?
慕的地6264312

TA贡献1817条经验 获得超6个赞

  1. 浮点数计算都会有舍入误差的

  2. 实时的数据可以通过与服务器建立websocket或者服务器主动推送


查看完整回答
反对 回复 2019-03-21
?
FFIVE

TA贡献1797条经验 获得超6个赞

javascirpt 为什么 0.3-0.2,0.3-0.1结果不准确,js还有哪些诸如此类的bug

这不是 bug ,去了解下“计算机原理”中的关于浮点数的基本概念。


查看完整回答
反对 回复 2019-03-21
?
四季花海

TA贡献1811条经验 获得超5个赞

计算机计算浮点数的时候是要转换成二进制的,二进制的0.3和0.2分别是
0.010011001100110...........
0.001100110011001................
很长的一段,计算机存储位数有限,加完之后再转换成10进制时就出现那种0.099999.....的情况

查看完整回答
反对 回复 2019-03-21
?
不负相思意

TA贡献1777条经验 获得超10个赞

这是原来看到的代码,先将小数转换成整形,计算结束后再转换回去


    function add(num1, num2){ 

        let r1, r2, m;

        r1 = (''+num1).split('.')[1].length; 

        r2 = (''+num2).split('.')[1].length; 

        m = Math.pow(10,Math.max(r1,r2)); 

        return (num1 * m + num2 * m) / m; 

    } 

    console.log(add(0.1,0.2)); //0.3 

    console.log(add(0.15,0.2256));


查看完整回答
反对 回复 2019-03-21
  • 5 回答
  • 0 关注
  • 623 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号