欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

js為什么不能正確處理小數(shù)運(yùn)算?

 更新時(shí)間:2015年12月29日 10:11:33   投稿:lijiao  
這篇文章主要介紹了js不能正確處理小數(shù)運(yùn)算的原因,為大家解除js為什么不能正確處理小數(shù)運(yùn)算的疑慮,感興趣的小伙伴們可以參考一下
var sum = 0;
for(var i = 0; i < 10; i++) {
 sum += 0.1;
}

console.log(sum);

上面的程序會(huì)輸出1嗎?

你有必要知道的 25 個(gè) JavaScript 面試題 一文中,第 8 個(gè)題淺顯的說了下 js 為什么不能正確處理小數(shù)運(yùn)算的問題。今天重拾舊題,更深層次的剖析下這個(gè)問題。

但要先說明的是,不能正確處理小數(shù)的運(yùn)算并不是 JavaScript 語言本身的設(shè)計(jì)錯(cuò)誤,其它高級編程語言,如C,Java等,也是不能正確處理小數(shù)運(yùn)算的:

#include <stdio.h>

void main(){
  float sum;
  int i;
  
  sum = 0;
  
  for(i = 0; i < 100; i++) {
    sum += 0.1;
  }
  
  printf('%f\n', sum); //10.000002
}

數(shù)在計(jì)算機(jī)內(nèi)部的表示

我們都知道,用高級編程語言編寫的程序需要經(jīng)過解釋、編譯等操作轉(zhuǎn)變成 CPU(Central Processing Unit) 可以識(shí)別的機(jī)器語言才能運(yùn)行,而對 CPU 來說,它不識(shí)別數(shù)的十進(jìn)制、八進(jìn)制和十六進(jìn)制等,我們在程序中聲明的這些進(jìn)制數(shù)都會(huì)被轉(zhuǎn)成二進(jìn)制數(shù)進(jìn)行運(yùn)算。

為什么不是轉(zhuǎn)換成三進(jìn)制數(shù)進(jìn)行運(yùn)算呢?

計(jì)算機(jī)內(nèi)部是由很多的 IC (Integrated Circuit: 集成電路) 這種電子部件構(gòu)成的,它的長相大概是這樣子:

IC 有很多種形狀,在其兩側(cè)或內(nèi)部并排排列著很多引腳(圖示只畫出了一側(cè))。IC 的所有引腳,只有直流電壓 0V 或 5V 兩個(gè)狀態(tài),即一個(gè) IC 引腳只能表示兩個(gè)狀態(tài)。IC 的這個(gè)特性就決定了計(jì)算機(jī)內(nèi)部的數(shù)據(jù)只能用二進(jìn)制數(shù)處理。

由于1 位(一個(gè)引腳)只能表示兩個(gè)狀態(tài),所以二進(jìn)制的計(jì)算方式就變成了 0、1、10、11、100….這種形式:

所以,在數(shù)的運(yùn)算中,所有操作數(shù)都會(huì)被轉(zhuǎn)成二進(jìn)制數(shù)參與運(yùn)算,如39,會(huì)被轉(zhuǎn)換成二進(jìn)制 00100111

小數(shù)的二進(jìn)制表示

如前文所說,程序中的數(shù)據(jù)都會(huì)被轉(zhuǎn)換成二進(jìn)制數(shù),小數(shù)參與運(yùn)算時(shí),也會(huì)被轉(zhuǎn)成二進(jìn)制,如十進(jìn)制的11.1875 會(huì)被轉(zhuǎn)換成1101.0010。

小數(shù)點(diǎn)后 4 位用二進(jìn)制數(shù)表示的數(shù)值范圍是 0.0000~0.1111,因此,這只能表示 0.5、0.25、0.125、0.0625 這四個(gè)十進(jìn)制數(shù)以及小數(shù)點(diǎn)后面的位權(quán)組合(相加)而成的小數(shù):

從上表可以看出,十進(jìn)制數(shù) 0 的下一位是 0.0625,所以,0~0.0625 之間的小數(shù),就無法用小數(shù)點(diǎn)后 4 位數(shù)的二進(jìn)制數(shù)表示;如果增加二進(jìn)制數(shù)小數(shù)點(diǎn)后面的位數(shù),與其相對應(yīng)的十進(jìn)制數(shù)的個(gè)數(shù)也會(huì)增加,但無論增加多少位,都無法得到 0.1 這個(gè)結(jié)果。實(shí)際上,0.1 轉(zhuǎn)換成二進(jìn)制是 0.00110011001100110011…… 注意 0011 是無限重復(fù)的:

console.log(0.2+0.1);

//操作數(shù)的二進(jìn)制表示
0.1 => 0.0001 1001 1001 1001…(無限循環(huán))
0.2 => 0.0011 0011 0011 0011…(無限循環(huán))

js 的 Number 類型并沒有像 C / Java 等分整型、單精度、雙精度等,而是統(tǒng)一表現(xiàn)為雙精度浮點(diǎn)型。按照 IEEE 的規(guī)定,單精度浮點(diǎn)數(shù)用 32 位表示全體小數(shù),而雙精度浮點(diǎn)數(shù)用 64 位表示全體小數(shù),而浮點(diǎn)數(shù)由符號、尾數(shù)、指數(shù)和基數(shù)組成,所以并不是所有的位數(shù)都用來表示小數(shù),符號、指數(shù)等也要占據(jù)位數(shù),基數(shù)不占據(jù)位數(shù):

雙精度浮點(diǎn)數(shù)的小數(shù)部分最多支持 52 位,所以兩者相加之后得到這么一串 0.0100110011001100110011001100110011001100…因浮點(diǎn)數(shù)小數(shù)位的限制而截?cái)嗟亩M(jìn)制數(shù)字,這時(shí)候,再把它轉(zhuǎn)換為十進(jìn)制,就成了 0.30000000000000004。

總結(jié)

js 不能正確處理小數(shù)運(yùn)算,包括其它高級編程語言一樣,這不是語言本身的設(shè)計(jì)錯(cuò)誤,而是計(jì)算機(jī)內(nèi)部本身就不能正確處理小數(shù)的運(yùn)算,對小數(shù)的運(yùn)算往往會(huì)得到意想不到的結(jié)果,因?yàn)椴⒉皇撬械氖M(jìn)制小數(shù)能被二進(jìn)制表示。

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助。

相關(guān)文章

  • 基于Javascript實(shí)現(xiàn)二級聯(lián)動(dòng)菜單效果

    基于Javascript實(shí)現(xiàn)二級聯(lián)動(dòng)菜單效果

    這篇文章主要為大家詳細(xì)介紹了基于Javascript實(shí)現(xiàn)二級聯(lián)動(dòng)菜單效果的相關(guān)資料,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-03-03
  • JS+css3實(shí)現(xiàn)幻燈片輪播圖

    JS+css3實(shí)現(xiàn)幻燈片輪播圖

    這篇文章主要為大家詳細(xì)介紹了JS+css3實(shí)現(xiàn)幻燈片輪播圖,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-08-08
  • 微信小程序?qū)崿F(xiàn)語音識(shí)別轉(zhuǎn)文字功能及遇到的坑

    微信小程序?qū)崿F(xiàn)語音識(shí)別轉(zhuǎn)文字功能及遇到的坑

    這篇文章主要介紹了小程序?qū)崿F(xiàn)語音識(shí)別轉(zhuǎn)文字功能,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-08-08
  • js實(shí)現(xiàn)單擊可修改表格

    js實(shí)現(xiàn)單擊可修改表格

    這篇文章主要為大家詳細(xì)介紹了js實(shí)現(xiàn)單擊可修改表格,類似成績單,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-04-04
  • js事件冒泡實(shí)例分享(已測試)

    js事件冒泡實(shí)例分享(已測試)

    js事件冒泡實(shí)例:摘的網(wǎng)上的例子,但是他寫的有錯(cuò)誤,自己改正了下,已驗(yàn)證通過,感興趣的朋友可以參考下哈
    2013-04-04
  • 簡單談?wù)刟xios中的get,post方法

    簡單談?wù)刟xios中的get,post方法

    下面小編就為大家?guī)硪黄唵握務(wù)刟xios中的get,post方法。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-06-06
  • JS實(shí)現(xiàn)不規(guī)則TAB選項(xiàng)卡效果代碼

    JS實(shí)現(xiàn)不規(guī)則TAB選項(xiàng)卡效果代碼

    這篇文章主要介紹了JS實(shí)現(xiàn)不規(guī)則TAB選項(xiàng)卡效果代碼,通過簡單的JavaScript響應(yīng)鼠標(biāo)事件動(dòng)態(tài)變換元素樣式實(shí)現(xiàn)不規(guī)則選項(xiàng)卡效果,非常具有實(shí)用價(jià)值,需要的朋友可以參考下
    2015-09-09
  • Require.JS中的幾種define定義方式示例

    Require.JS中的幾種define定義方式示例

    這篇文章主要給大家介紹了關(guān)于Require.JS中幾種define定義方式的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起看看吧。
    2017-06-06
  • Javascript 閉包詳解及實(shí)例代碼

    Javascript 閉包詳解及實(shí)例代碼

    這篇文章主要介紹了Javascript 閉包詳解及實(shí)例代碼的相關(guān)資料,閉包是一個(gè)特別抽象的概念,特別是ECMA規(guī)范給的定義,如果沒有實(shí)戰(zhàn)經(jīng)驗(yàn),很難從定義去理解它,需要的朋友可以參考下
    2016-11-11
  • JavaScript返回網(wǎng)頁中超鏈接數(shù)量的方法

    JavaScript返回網(wǎng)頁中超鏈接數(shù)量的方法

    這篇文章主要介紹了JavaScript返回網(wǎng)頁中超鏈接數(shù)量的方法,使用javascript中的document.links實(shí)現(xiàn)這一功能,需要的朋友可以參考下
    2015-04-04

最新評論