Javascript數字精度丟失的問題

一、問題

0.1 + 0.2 === 0.3 // false

二、浮點數

“浮點數”是一種表示數字的標準,整數也可以用浮點數的格式來存儲

我們也可以理解成,浮點數就是小數

JavaScript中,現在主流的數值類型是Number,而Number采用的是IEEE754規范中64位雙精度浮點數編碼

這樣的存儲結構優點是可以歸一化處理整數和小數,節省存儲空間

對于一個整數,可以很輕易轉化成十進制或者二進制。但是對于一個浮點數來說,因為小數點的存在,小數點的位置不是固定的。解決思路就是使用科學計數法,這樣小數點位置就固定了

而計算機只能用二進制(0或1)表示,二進制轉換為科學記數法的公式如下:

其中,a的值為0或者1,e為小數點移動的位置

舉個例子:

27.0轉化成二進制為11011.0 ,科學計數法表示為:

前面講到,javaScript存儲方式是雙精度浮點數,其長度為8個字節,即64位比特

64位比特又可分為三個部分:

  • 符號位S:第 1 位是正負數符號位(sign),0代表正數,1代表負數
  • 指數位E:中間的 11 位存儲指數(exponent),用來表示次方數,可以為正負數。在雙精度浮點數中,指數的固定偏移量為1023
  • 尾數位M:最后的 52 位是尾數(mantissa),超出的部分自動進一舍零

三、問題分析

javascript語言中,0.1 和 0.2 都轉化成二進制后再進行運算

所以輸出false

再來一個問題,那么為什么x=0.1得到0.1

主要是存儲二進制時小數點的偏移量最大為52位,最多可以表達的位數是2^53=9007199254740992,對應科學計數尾數是?9.007199254740992,這也是 JS 最多能表示的精度

它的長度是 16,所以可以使用?toPrecision(16)?來做精度運算,超過的精度會自動做湊整處理

但看到的?0.1?實際上并不是?0.1。用更高的精度試試:

四、結論

計算機存儲雙精度浮點數需要先把十進制數轉換為二進制的科學記數法的形式,然后計算機以自己的規則{符號位+(指數位+指數偏移量的二進制)+小數部分}存儲二進制的科學記數法

因為存儲時有位數限制(64位),并且某些十進制的浮點數在轉換為二進制數時會出現無限循環,會造成二進制的舍入操作(0舍1入),當再轉換為十進制時就造成了計算誤差

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/697744.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/697744.shtml
英文地址,請注明出處:http://en.pswp.cn/news/697744.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

uniapp開發微信小程序跳轉到另一個小程序中

注意:一開始我的云上務工模塊是單獨的tabbar界面,但是小程序跳轉好像不能直接點擊tabbar進行,所以我將這里改成了點擊首頁中的按鈕進行跳轉 點擊這里進行小程序跳轉 目錄 基礎講解 uniapp小程序跳轉的兩個方法 調用說明(半屏跳轉…

C++力扣題目 647--回文子串 516--最長回文子序列

647. 回文子串 力扣題目鏈接(opens new window) 給定一個字符串,你的任務是計算這個字符串中有多少個回文子串。 具有不同開始位置或結束位置的子串,即使是由相同的字符組成,也會被視作不同的子串。 示例 1: 輸入&#xff1a…

面試系列之《Spark》(持續更新...)

參考文檔及示例代碼均基于pyspark3.1.2 1.什么是RDD?2.job、stage、task如何劃分?3.什么是寬窄依賴?4.spark有哪幾種部署模式?5.spark中的算子分為哪些類型,舉例說明。6.cache、persist、checkpoint的區別,…

C++模板為什么不能聲明和定義分離

首先我們要直到C程序運行需要進行的四個階段。 預處理->編譯->匯編->鏈接 編譯:對語法語義分析,分析無誤生成匯編,頭文件不參加編譯,多個源文件是分開單獨編譯的。 鏈接:將多個obj文件鏈接合成一個&#x…

ubuntu20.04安裝webots仿真

ubuntu20.04安裝webots仿真 1.首先: wget -qO- https://cyberbotics.com/Cyberbotics.asc | sudo apt-key add - sudo apt-add-repository deb https://cyberbotics.com/debian/ binary-amd64/ sudo apt-get update sudo apt-get install webots .bashrc中添加環境變量:…

Sora----打破虛實之間的最后一根枷鎖----這扇門的背后是人類文明的晟陽還是最后的余暉

目錄 一.Sora出道即巔峰 二.為何說Sora是該領域的巨頭 三.Sora無敵的背后究竟有怎樣先進的處理技術 1.Spacetime Latent Patches 潛變量時空碎片,建構視覺語言系統 2.擴散模型與Diffusion Transformer,組合成強大的信息提取器 3.DiT應用于潛變量時…

關于在分布式環境中RVN和使用場景的介紹4

簡介 在前面的文檔中,我們介紹了RVN的概念,通過RVN可以解決的某類問題和使用技巧,以及處理RVN的邏輯的具體實現。在本文中,我們將要介紹關于如何使用RVN解決另一種在分布式系統中常出現的問題。 問題 假設我們創建了一個servic…

C語言—自定義(構造)類型

2.20,17.56 1.只有當我們使用結構體類型定義變量/結構體數組,系統才會為結構體的成員分配內存空間,用于存儲對應類型的數據 2.strct 結構體 一起作為結構體類型標識符 嘿嘿暫時先這樣,我會回來改的1、定義一個表示公交線路的結構體,要…

pikachu靶場-CSRF

CSRF: 介紹: Cross-site request forgery簡稱為"CSRF”。 在CSF的攻擊場景中攻擊者會偽造一個請求(這個請求一般是一個鏈接) 然后欺騙目標用戶進行點擊,用戶一旦點擊了這個請求,整個攻擊也就完成了&#xff0…

VSCode-更改系統默認路徑

修改vscode中的默認擴展路徑:"%USERPROFILE%\.vscode" 打開目錄C:\用戶\電腦用戶名,將.vscode文件剪切至D:\VSCode文件夾下 用管理員身份打開cmd.exe命令界面輸入mklink /D "%USERPROFILE%\.vscode" "D:\VSCode\.vscode\"…

同一個包下 golang run時報undefined

問題描述 今天在運行一個項目,一個包下有兩個文件,分別是main.go和route,main函數在main.go文件中,main引用了route.go中的兩個函數,SetupRoutes和SetupAdminRoutes go build 編譯后,直接運行&#xff0c…

【C++私房菜】面向對象中的簡單繼承

文章目錄 一、 繼承基本概念二、派生類對象及派生類向基類的類型轉換三、繼承中的公有、私有和受保護的訪問控制規則四、派生類的作用域五、繼承中的靜態成員 一、 繼承基本概念 通過繼承(inheritance)聯系在一起的類構成一種層次關系。通常在層次關系的…

Leetcoder Day17| 二叉樹 part06

語言:Java/C 654.最大二叉樹 給定一個不含重復元素的整數數組。一個以此數組構建的最大二叉樹定義如下: 二叉樹的根是數組中的最大元素。左子樹是通過數組中最大值左邊部分構造出的最大二叉樹。右子樹是通過數組中最大值右邊部分構造出的最大二叉樹。 …

進程間傳遞 SQL 文的方法

SQL 文組成 SQL 文有 2 部分組成: SQL 原型,如:INSERT INTO test1 (id,name) VALUES (?,?)Args ,? 號對應的值列表 有時,生成 SQL 文的進程和處理 SQL 文的進程,可能不是同一個 這里就涉及到如何高效…

免費搭建個人網盤

免費搭建一個屬于個人的網盤。 服務端 詳情請參考原網站的服務端下載和安裝虛擬磁盤Fuse4Ui可以支持把網盤內容掛載成系統的分區; 掛載工具效果圖:應用端應用端的下載 效果圖

藍橋杯第1374題——鍛造兵器

題目描述 小明一共有n塊鍛造石,第塊鍛造石的屬性值為ai. 現在小明決定從這n塊鍛造石中任取兩塊來鍛造兵器 通過周密計算,小明得出,只有當兩塊鍛造石的屬性值的差值等于C,兵器才能鍛造成功 請你幫小明算算,他有多少種選…

人工智能幾個關鍵節點:深藍,AlphaGo,ChatGPT,Sora

近30年,人工智能幾個關鍵節點:深藍,AlphaGo,ChatGPT,Sora 深藍: 1997年,深藍擊敗卡斯帕羅夫的比賽是通過一系列復雜的算法和策略實現的。深藍的開發團隊使用了一種名為“暴力搜索”的技術&…

OGG-00918 映射中缺少鍵列 id.

2024-02-23 14:54:49 INFO OGG-02756 從線索文件獲取了表 GISTAR.PXPH_PON_ROUTE 的定義。. The following columns did not default because of type mismatches: id OGG-00918 映射中缺少鍵列 id. 目標端有字段ID,由于mysql自增,所以只能是b…

短劇小程序系統,重塑視頻觀看體驗的科技革命

隨著科技的飛速發展,人們對于數字化內容的消費需求也在不斷增長。在這個大背景下,短劇小程序作為一種新型的視頻觀看方式,正逐漸受到大眾的青睞。本文將探討短劇小程序的發展背景、特點以及市場前景,分析其在重塑視頻觀看體驗方面…

如何使用Inno Setup制作Unity構建程序的Windows安裝程序

1. 準備 (1)準備好Unity構建的程序集合 必須包括: Data文件夾(xxx_Data) Mono文件夾(MonoBleedingEdge) 打包的應用程序文件(xxx.exe) Unity播放器dll文件&#xff…