最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

JavaScript 浮點(diǎn)數(shù)精度問題小結(jié)

 更新時間:2025年02月13日 10:57:36   作者:前端夢工廠+  
浮點(diǎn)數(shù)精度問題是指在計算機(jī)中使用二進(jìn)制表示浮點(diǎn)數(shù)時,由于二進(jìn)制無法精確表示某些十進(jìn)制小數(shù),本文主要介紹了JavaScript 浮點(diǎn)數(shù)精度問題,具有一定的參考價值,感興趣的可以了解一下

一. 引言

浮點(diǎn)數(shù)精度問題是指在計算機(jī)中使用二進(jìn)制表示浮點(diǎn)數(shù)時,由于二進(jìn)制無法精確表示某些十進(jìn)制小數(shù),導(dǎo)致計算結(jié)果可能存在舍入誤差或不精確的情況。

這個問題主要源于浮點(diǎn)數(shù)的存儲方式。在計算機(jī)中,浮點(diǎn)數(shù)通常使用IEEE 754標(biāo)準(zhǔn)來表示。該標(biāo)準(zhǔn)將浮點(diǎn)數(shù)分為符號位、指數(shù)位和尾數(shù)位,使用科學(xué)計數(shù)法來表示一個浮點(diǎn)數(shù)。

二. 常見浮點(diǎn)數(shù)精度問題

1. 示例一:浮點(diǎn)值運(yùn)算結(jié)果

// 加法 
console.log(0.1 + 0.2); // 0.30000000000000004
console.log(0.7 + 0.1); // 0.7999999999999999
console.log(0.2 + 0.4); // 0.6000000000000001
console.log(2.22 + 0.1); // 2.3200000000000003
 
// 減法
console.log(1.5 - 1.2); // 0.30000000000000004
console.log(0.3 - 0.2); // 0.09999999999999998
 
// 乘法 
console.log(19.9 * 100); // 1989.9999999999998
console.log(19.9 * 10 * 10); // 1990
console.log(9.7 * 100); // 969.9999999999999
console.log(39.7 * 100); // 3970.0000000000005
 
// 除法 
console.log(0.3 / 0.1); // 2.9999999999999996
console.log(0.69 / 10); // 0.06899999999999999

運(yùn)行結(jié)果如下圖所示:

fileOf7298.png

2. 示例二:小數(shù)乘以10的n次方取整(比如:元轉(zhuǎn)分,米轉(zhuǎn)厘米)

console.log(parseInt(0.58 * 100, 10)); // 57

在上面的例子中,我們得出的結(jié)果是 57,而不是預(yù)期結(jié)果 58。

3. 示例三:四舍五入保留 n 位小數(shù)

例如我們會寫出 (number).toFixed(2) ,但是看下面的例子:

console.log((1.335).toFixed(2)); // 1.33

在上面的例子中,我們得出的結(jié)果是 1.33,而不是預(yù)期結(jié)果 1.34。

三. 為什么會出現(xiàn)這樣的結(jié)果

1. 浮點(diǎn)數(shù)表示

在計算機(jī)中,浮點(diǎn)數(shù)通常使用IEEE 754標(biāo)準(zhǔn)來表示。該標(biāo)準(zhǔn)將浮點(diǎn)數(shù)分為符號位、指數(shù)位和尾數(shù)位,使用科學(xué)計數(shù)法來表示一個浮點(diǎn)數(shù)。

該規(guī)范定義了浮點(diǎn)數(shù)的格式,對于 64 位的浮點(diǎn)數(shù)在內(nèi)存中的表示,最高的 1 位是符號位,接著的 11 位是指數(shù),剩下的 52 位為有效數(shù)字,具體表示方式如下:

  • 符號位 S:用于表示正負(fù)號。第 1 位是正負(fù)數(shù)符號位(sign),0 代表正數(shù),1 代表負(fù)數(shù)。

  • 指數(shù)位 E:用于表示浮點(diǎn)數(shù)的指數(shù)部分,以二進(jìn)制補(bǔ)碼形式存儲。中間的 11 位存儲指數(shù)(exponent),用來表示次方數(shù)。

  • 尾數(shù)位 M:用于表示浮點(diǎn)數(shù)的有效數(shù)字部分,以二進(jìn)制形式存儲。最后的 52 位是尾數(shù)(mantissa),儲存小數(shù)部分,超出的部分自動進(jìn)一舍零。

即:浮點(diǎn)數(shù)最終在運(yùn)算的時候?qū)嶋H上是一個符合該標(biāo)準(zhǔn)的二進(jìn)制數(shù)

符號位決定了一個數(shù)的正負(fù),指數(shù)部分決定了數(shù)值的大小,小數(shù)部分決定了數(shù)值的精度。

IEEE 754 規(guī)定,有效數(shù)字第一位默認(rèn)總是 1,不保存在 64 位浮點(diǎn)數(shù)之中。也就是說,有效數(shù)字總是 1.xx…xx 的形式,其中 xx…xx 的部分保存在 64 位浮點(diǎn)數(shù)之中,最長可能為 52 位。因此,JavaScript 提供的有效數(shù)字最長為 53 個二進(jìn)制位(64 位浮點(diǎn)的后 52 位 + 有效數(shù)字第一位的 1)。

既然限定位數(shù),必然有截斷的可能。

2. 舉例說明

示例一

console.log(0.1 + 0.2); // 0.30000000000000004

為了驗(yàn)證該例子,我們得先知道怎么將浮點(diǎn)數(shù)轉(zhuǎn)換為二進(jìn)制,整數(shù)我們可以用除 2 取余的方式,小數(shù)我們則可以用乘 2 取整的方式。

*0.1* 轉(zhuǎn)換為二進(jìn)制

0.1 * 2,值為 0.2,小數(shù)部分 0.2,整數(shù)部分 0

0.2 * 2,值為 0.4,小數(shù)部分 0.4,整數(shù)部分 0

0.4 * 2,值為 0.8,小數(shù)部分 0.8,整數(shù)部分 0

0.8 * 2,值為 1.6,小數(shù)部分 0.6,整數(shù)部分 1

0.6 * 2,值為 1.2,小數(shù)部分 0.2,整數(shù)部分 1

0.2 * 2,值為 0.4,小數(shù)部分 0.4,整數(shù)部分 0

從 0.2 開始循環(huán)

*0.2* 轉(zhuǎn)換為二進(jìn)制

可以直接參考上述,肯定最后也是一個循環(huán)的情況

所以最終我們能得到兩個循環(huán)的二進(jìn)制數(shù):

0.1:0.0001 1001 1001 1001 1001 1001 1001 1001 1001 1001 1001 1001 1100 ...

0.2:0.0011 0011 0011 0011 0011 0011 0011 0011 0011 0011 0011 0011 0011 ...

這兩個的和的二進(jìn)制就是:

sum:0.0100 1100 1100 1100 1100 1100 1100 1100 1100 1100 1100 1100 1100 1100 ...

最終我們只能得到和的近似值(按照 IEEE 754 標(biāo)準(zhǔn)保留 52 位,按 0 舍 1 入來取值),然后轉(zhuǎn)換為十進(jìn)制數(shù)變成:

sum ≈ 0.30000000000000004

示例二

console.log((1.335).toFixed(2)); // 1.33

因?yàn)?nbsp;1.335 其實(shí)是 1.33499999999999996447286321199,toFixed 雖然是四舍五入,但是是對 1.33499999999999996447286321199 進(jìn)行四五入,所以得出 1.33。

示例三

在 Javascript 中,整數(shù)精度同樣存在問題,先來看看問題:

console.log(19571992547450991) // 19571992547450990
console.log(19571992547450991 === 19571992547450992) // true

如下圖所示:

fileOf7298.png

同樣的原因,在 JavaScript 中 number 類型統(tǒng)一按浮點(diǎn)數(shù)處理,整數(shù)是按最大 54 位來算。

  • 最大( 253 - 1,Number.MAX_SAFE_INTEGER、9007199254740991)

  • 最小( -(253 - 1) ,Number.MIN_SAFE_INTEGER、*-9007199254740991*)

在浮點(diǎn)數(shù)計算中,有一些特定的小數(shù)情況可以避免舍入誤差。這是因?yàn)檫@些特定的小數(shù)可以精確地表示為二進(jìn)制分?jǐn)?shù),而不會導(dǎo)致舍入誤差。以下是一些常見的特定情況:

  • 小數(shù)部分是2的負(fù)整數(shù)次冪:例如,0.5、0.25、0.125等。這些小數(shù)在二進(jìn)制中可以精確表示,因此計算時不會出現(xiàn)舍入誤差。

  • 小數(shù)部分是10的負(fù)整數(shù)次冪:例如,0.1、0.01、0.001等。盡管在十進(jìn)制中無法精確表示,但在二進(jìn)制中可以通過有限位數(shù)進(jìn)行近似表示,并且通常不會引起明顯的舍入誤差。

四. 總結(jié)

浮點(diǎn)數(shù)精度問題是計算機(jī)科學(xué)中一個常見的問題,由于二進(jìn)制無法精確表示某些十進(jìn)制小數(shù),進(jìn)行浮點(diǎn)數(shù)運(yùn)算時可能會出現(xiàn)舍入誤差。為了解決這個問題,可以使用整數(shù)進(jìn)行計算、使用專門的庫或者比較時使用誤差范圍。了解浮點(diǎn)數(shù)精度問題對于開發(fā)人員在處理浮點(diǎn)數(shù)運(yùn)算時具有重要意義。

到此這篇關(guān)于JavaScript 浮點(diǎn)數(shù)精度問題小結(jié)的文章就介紹到這了,更多相關(guān)JavaScript 浮點(diǎn)數(shù)精度內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • moment的一些常見用法總結(jié)大全

    moment的一些常見用法總結(jié)大全

    這篇文章主要給大家總結(jié)介紹了關(guān)于moment的一些常見用法,moment.js是一個輕量級的JavaScript時間庫,對于日常開發(fā)中可能會存在獲取時間、設(shè)置時間、格式化時間、比較時間等,需要的朋友可以參考下
    2023-09-09
  • JavaScript中一些特殊的字符運(yùn)算

    JavaScript中一些特殊的字符運(yùn)算

    這篇文章主要介紹了JavaScript中一些特殊的字符運(yùn)算的相關(guān)資料,需要的朋友可以參考下
    2017-08-08
  • JavaScript循環(huán)遍歷的24個方法,你都知道嗎

    JavaScript循環(huán)遍歷的24個方法,你都知道嗎

    這篇文章主要給大家介紹了關(guān)于JavaScript循環(huán)遍歷的24個方法,文中對每種方法都給出了詳細(xì)的實(shí)例代碼,方便大家理解學(xué)習(xí),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2021-09-09
  • JavaScript實(shí)現(xiàn)簡單精致的圖片左右無縫滾動效果

    JavaScript實(shí)現(xiàn)簡單精致的圖片左右無縫滾動效果

    這篇文章主要介紹了JavaScript實(shí)現(xiàn)簡單精致的圖片左右無縫滾動效果,涉及javascript結(jié)合時間函數(shù)動態(tài)操作頁面元素屬性的相關(guān)技巧,需要的朋友可以參考下
    2017-03-03
  • ES6中Set和Map數(shù)據(jù)結(jié)構(gòu)的簡單講解

    ES6中Set和Map數(shù)據(jù)結(jié)構(gòu)的簡單講解

    大家心里是否產(chǎn)生過這樣的疑問,JS中既然已經(jīng)有對象這種數(shù)據(jù)結(jié)構(gòu),我們?yōu)槭裁催€要再單獨(dú)去使用Set或者M(jìn)ap呢?下面這篇文章主要給大家介紹了關(guān)于ES6中Set和Map數(shù)據(jù)結(jié)構(gòu)的相關(guān)資料,需要的朋友可以參考下
    2022-08-08
  • js 數(shù)組隨機(jī)字符串(廣告不重復(fù))

    js 數(shù)組隨機(jī)字符串(廣告不重復(fù))

    今天一個網(wǎng)友想讓他的廣告隨機(jī)顯示,每次刷新廣告的內(nèi)容都不一樣,經(jīng)過參考源碼網(wǎng)站分析就是通過下面代碼實(shí)現(xiàn),特分享下方便需要的朋友
    2013-08-08
  • javascript設(shè)計模式 – 外觀模式原理與用法實(shí)例分析

    javascript設(shè)計模式 – 外觀模式原理與用法實(shí)例分析

    這篇文章主要介紹了javascript設(shè)計模式 – 外觀模式,結(jié)合實(shí)例形式分析了javascript外觀模式基本概念、原理、用法及操作注意事項(xiàng),需要的朋友可以參考下
    2020-04-04
  • 微信小程序左滑刪除功能開發(fā)案例詳解

    微信小程序左滑刪除功能開發(fā)案例詳解

    這篇文章主要介紹了微信小程序左滑刪除功能開發(fā)案例詳解,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-11-11
  • js解決pdf使用iframe打印報跨域錯誤問題的方法示例

    js解決pdf使用iframe打印報跨域錯誤問題的方法示例

    這篇文章主要給大家介紹了關(guān)于js解決pdf使用iframe打印報跨域錯誤問題的相關(guān)資料,文中通過代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用js具有一定的參考借鑒價值,需要的朋友可以參考下
    2024-03-03
  • js數(shù)組去重的方法匯總

    js數(shù)組去重的方法匯總

    本文給大家匯總介紹了3種javascript數(shù)組去重的方法以及示例,十分的簡單實(shí)用,有需要的小伙伴可以參考下。
    2015-07-07

最新評論

安陆市| 宜宾市| 宾川县| 静海县| 德钦县| 芜湖市| 保亭| 潢川县| 宣威市| 晋城| 忻城县| 中山市| 抚顺市| 永仁县| 利辛县| 芒康县| 民和| 光泽县| 昭苏县| 阿合奇县| 铅山县| 荣成市| 雅安市| 高邑县| 乐都县| 泰来县| 华阴市| 郑州市| 成都市| 盐城市| 松原市| 余庆县| 女性| 涞源县| 塔城市| 蒲城县| 宜昌市| 洛南县| 富裕县| 永安市| 鸡东县|