鍍金池/ 問(wèn)答/HTML/ javascirpt 為什么 0.3-0.2結(jié)果不準(zhǔn)確

javascirpt 為什么 0.3-0.2結(jié)果不準(zhǔn)確

javascirpt 為什么 0.3-0.2,0.3-0.1結(jié)果不準(zhǔn)確,js還有哪些諸如此類的bug,另外用vue寫(xiě)股票實(shí)時(shí)數(shù)據(jù)這種頁(yè)面除了定時(shí)器獲取數(shù)據(jù)渲染頁(yè)面,還有什么好的方法

回答
編輯回答
萌二代
javascirpt 為什么 0.3-0.2,0.3-0.1結(jié)果不準(zhǔn)確,js還有哪些諸如此類的bug

這不是 bug ,去了解下“計(jì)算機(jī)原理”中的關(guān)于浮點(diǎn)數(shù)的基本概念。

2017年8月27日 03:53
編輯回答
萌吟
  1. 因?yàn)?js 里面浮點(diǎn)數(shù)運(yùn)算不是 100% 精確的,解決方法:以你給的例子可以 (0.3 * 10 + 0.2 * 10) / 10,即先轉(zhuǎn)換成整數(shù)
  2. 很多語(yǔ)言在設(shè)計(jì)上都會(huì)有一定的缺陷,有的是設(shè)計(jì)失誤,有的是折中取舍。你可以搜索下 js 缺陷 陷阱 等關(guān)鍵字,會(huì)找到你想要的
  3. 可以使用 websocket,讓服務(wù)器推送
2018年5月24日 01:44
編輯回答
互擼娃
  1. 浮點(diǎn)數(shù)計(jì)算都會(huì)有舍入誤差的
  2. 實(shí)時(shí)的數(shù)據(jù)可以通過(guò)與服務(wù)器建立websocket或者服務(wù)器主動(dòng)推送
2018年4月12日 17:25
編輯回答
野橘

計(jì)算機(jī)計(jì)算浮點(diǎn)數(shù)的時(shí)候是要轉(zhuǎn)換成二進(jìn)制的,二進(jìn)制的0.3和0.2分別是
0.010011001100110...........
0.001100110011001................
很長(zhǎng)的一段,計(jì)算機(jī)存儲(chǔ)位數(shù)有限,加完之后再轉(zhuǎn)換成10進(jìn)制時(shí)就出現(xiàn)那種0.099999.....的情況

2017年3月15日 05:40
編輯回答
綰青絲

這是原來(lái)看到的代碼,先將小數(shù)轉(zhuǎn)換成整形,計(jì)算結(jié)束后再轉(zhuǎn)換回去

    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));
2018年2月13日 07:39