lua 從一串數字中取出偶數位的數字_為什么JavaScript中 0.1 0.2 不等于0.3?

在 js 中進行數學的運算時,會出現0.1+0.2=0.300000000000000004的結果,一開始認為是浮點數的二進制存儲導致的精度問題,但這似乎不能很好的解釋為什么在同樣的存儲方式下0.3+0.4=0.7可以得到正確的結果。本文主要通過浮點數的二進制存儲及運算,和IEEE754下的舍入規則,解釋為何會出現這種情況。

一、浮點數的二進制存儲

JavaScript遵循IEEE754標準,在64位中存儲一個數據的有效數字形式。

6f2ff457bbbf548d04f5e997c11b2d51.png

其中,第0位為符號位,0表示正數1表示負數;第1到11位存儲指數部分;第12到63位存小數部分(尾數部分)(即有效數字)。由于二進制的有效數字總是表示為 1.xxx…的形式,尾數部分在規約形式下的第一位默認為1,故存儲時第一位省略不寫,尾數部分f存儲有效數字小數點后的xxx...,最長52位。因此,JavaScript提供的有效數字最長為53個二進制位(尾數部分52位+被省略的1位)。

以0.1、0.2、0.3、0.4和0.7的二進制形式為例:

0.1->0.0001100110011...(0011無限循環)->0-01111111011-(1 .)1001100110011001100110011001100110011001100110011010(入)0.2->0.001100110011...(0011無限循環)->0-01111111100-(1 .)1001100110011001100110011001100110011001100110011010(入)0.3->0.01001100110011...(0011無限循環)->0-01111111101-(1 .)0011001100110011001100110011001100110011001100110011(舍)0.4->0.01100110011...(0011無限循環)->0-01111111101-(1 .)1001100110011001100110011001100110011001100110011010(入)0.7->0.101100110011...(0011無限循環)->0-01111111110-(1 .)0110011001100110011001100110011001100110011001100110(舍)

對于52位之后進行舍入運算,此時可看作0舍1入(具體舍入規則在第三部分詳細說明),有精度損失。

二、對階運算

由于指數位數不同,運算時需要進行對階運算。對階過程略,0.1+0.2與0.3+0.4的尾數求和結果分別如下:

0.1+0.2->10.01100110011001100110011001100110011001100110011001110.3+0.4->10.1100110011001100110011001100110011001100110011001101

求和結果需規格化(有效數字表示),右規導致低位丟失,此時需對丟失的低位進行舍入操作:

0.1+0.2->1.00110011001100110011001100110011001100110011001100111->1.0011001100110011001100110011001100110011001100110100(入)0.3+0.4->1.01100110011001100110011001100110011001100110011001101->1.0110011001100110011001100110011001100110011001100110(舍)

即:
00111->0100
01101->0110

此處同樣有精度損失。在這里我們可以發現,0.3+0.4對階階運算且規格化后的運算結果與0.7在二進制中的存儲尾數相同(可對照尾數后幾位),而0.1+0.2的運算結果與0.3的存儲尾數不同,且0.1+0.2轉化為十進制時結果為0.300000000000000004。
此時,雖然0.1+0.2與0.3+0.4進行舍入操作的近似位都為1,但一入一舍導致計算結果與“標準答案”的異同。

三、IEEE754標準下的舍入規則

維基百科對最近偶數舍入原則的解釋如下:舍入到最接近,在一樣接近的情況下偶數優先(Ties To Even,這是默認的舍入方式),即會將結果舍入為最接近(精度損失最小)且可以表示的值,但是當存在兩個數一樣接近的時候,則取其中的偶數(在二進制中是以0結尾的)。

首先要注意的是,保留小數不是只看后面一位或者兩位,而是看保留位后面的所有位。

32b5c9fafcbcddae883ddb8786e06daa.png

如圖,可以看到近似需要看三位,保留位(近似后的最低位)、近似位(保留位的后一位)、粘滯位(sticky bit 近似位后的所有位進行或運算后看作一位)。
當粘滯位為1時,舍入規則可以看作0舍1入,近似位為0舍,近似位為1入(即第一部分小數二進制存儲為52位尾數時所進行的舍入操作)。
當粘滯位為0時,若近似位為0則舍去。
當粘滯位為0時,若近似位為1,無論舍入精度損失都相同,故需取舍入兩種結果中的偶數:保留位為1時入,保留位為0時舍(即第二部分對階運算規格化時的舍入操作)。

四、總結思考

由于IEEE754標準,這樣的“bug”不止在JavaScript中會出現,在所有采用該標準的語言中都會存在,實際編程中可以通過設置精度保留位數等方式解決。

05c506cf48ca127af427eaddfe6ef19b.png

想了解跟多的基礎理念指南:

1、關注我,轉發+評論

2、私信發送:【電子書】,即可領取

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

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

相關文章

zookeeper啟動后沒有相關進程

查看狀態報錯,報錯,百度碩士nc問題,讓看.out文件,但是這哥文件是空的,那就看log 016-12-15 14:08:19,355 [myid:] - INFO [main:QuorumPeer$QuorumServer149] - Resolved hostname: StandByNameNode to address: Stan…

html如何播放h264視頻,瀏覽器 – 我如何播放H264視頻?

嗯..從它的外觀看起來它不像H264文件..通過MediaInfo運行它,我得到了這個:VideoFormat : AVCFormat/Info : Advanced Video CodecFormat profile : BaselineL2.0Format settings, CABAC : NoFormat settings, ReFrames : 1 frameWidth : 352 pixelsHeight : 288 pix…

ebs r12 -- adadmin: error while loading shared libraries: libclntsh.so.10.1

安裝EBS R12.2增加中文字符集時,運行$AU_TOP/bin/adadmin出錯: $ adadmin adadmin: error while loading shared libraries: libclntsh.so.10.1: cannot open shared object file: No such file or directory產因是沒有配置應用管理用戶的環境變量。 對.…

kingedit 上傳php_php文件上傳下載實例(實現最簡單的網盤功能)

本人是一個新手代碼狗,第一次發表博客,歡迎大大們指點!最近手頭有一個文件上傳下載的案例,跟大家一起分享一下作為一個新手的苦逼成長歷程!話不多說,先上代碼:一:這個是一個文件上傳的html頁面&…

Perl 面對對象的案例理解

晚上仔細的推敲了下大駱駝的案例,由于有段時間沒繼續看下去了,導致有些地方忘記了。 今天仔細的翻了下面對對象那塊,說實話,認真看,用心看的話,就能看明白它寫神碼。 看完前面一堆的理論,發現一…

計算機發展與應用,網絡計算機的發展與應用

網絡計算機(Network Computer),簡稱NC,是專用于高速網絡環境下的一種計算機終端設備。它一般不需要硬盤、軟驅及光驅等外部存儲器,而是通過網絡獲取大部分資源,其所需要的應用程序和數據都存儲在服務器上。NC與PC的比較隨著網絡技…

ASP.NET 緩存技術分析

緩存功能是大型網站設計一個很重要的部分。由數據庫驅動的Web應用程序,如果需要改善其性能,最好的方法是使用緩存功能。可能的情況下盡量使用緩 存,從內存中返回數據的速度始終比去數據庫查的速度快,因而可以大大提供應用程序的性…

分布式搜索 Elasticsearch —— 刪除索引

為什么80%的碼農都做不了架構師?>>> 刪除索引的方式很多,這里列舉三種。 指定 index 、type、id 執行刪除 package com.gsoft.gsearch.util;import org.elasticsearch.action.get.GetResponse; import org.junit.Test;import com.gsoft.gsea…

springmvc攔截器對請求參數解密_SpringMVC攔截器如何修改請求參數

攔截器1,基本攔截器:package cn.ijava.interceptor;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import org.springframework.web.servlet.HandlerInterceptor;import org.springframework.web.servle…

SQL Server 2008安裝配置說明書+簡單使用 親測可用

SQL Server 2008 序列號:Developer: PTTFM-X467G-P7RH2-3Q6CG-4DMYBEnterprise: JD8Y6-HQG69-P9H84-XDTPG-34MBB 產品秘藥JD8Y6-HQG69-P9H84-XDTPG-34MBB 下面只說企業版安裝說明 SQL Server版本:SQL Server 2008 企業版。 安裝Microsoft SQL Server 20…

計算機云客戶端,藍奏云網盤客戶端 0.3.7電腦版

藍奏云由于不限速、下載速度快被很多用戶所歡迎,不過藍奏云沒有客戶端,上傳下載有時也不太方便,這里有大神寫了藍奏云網盤客戶端,采用藍奏云API項目使用PyQt5實現圖形界面,藍奏云盤API項目實現了對藍奏網盤的基本操作: 登錄、列出…

IT知識免費學習視頻地址大全

Jquery2.0實戰 http://edu.ibeifeng.com/view-index-id-318.html使用SSH框架技術開發學籍管理系統-Hibernate 部分http://edu.ibeifeng.com/view-index-id-319.htmlSpring 實戰:使用 SSH 框架技術開發學籍管理系統http://edu.ibeifeng.com/view-index-id-320.htmlStruts 實戰:使…

三十分鐘學會SED

本文承接之前寫的三十分鐘學會AWK一文,在學習完AWK之后,趁熱打鐵又學習了一下SED,不得不說這兩個工具真的堪稱文本處理神器,誰用誰知道!本文大部分內容依舊是翻譯自Tutorialspoint上的入門教程,這次是 Sed …

unity實現圖片輪播效果_Unity實現圖片輪播組件

游戲中有時候會見到圖片輪播的效果,那么這里就自己封裝了一個,包括自動輪播、切頁按鈕控制、頁碼下標更新、滑動輪播、切頁后的回調等等 。下面,先上一個簡陋的gif動態效果圖從圖中可以看出,該示例包括了三張圖片的輪播&#xff0…

[置頂] 2013騰訊編程馬拉松初賽第4場(3月24)(HDU 4520 HDU4521 HDU4522 HDU4523 HDU4524)...

話說昨天比賽終于拿到一個不錯的名次,rank77,對于我們這種ACM弱菜的學校來說已經很好了,可惜我1003用了倆floyd超時,如果我最近稍微搞搞圖論的話,用個bellman,或者SPFA,絕對超不了了就。。。哎。…

計算機學院年會,重慶大學計算機學院舉行2019年迎新晚會

2019年12月6號晚,重慶大學計算機學院2019年迎新晚會在蘭園小劇場舉行。出席本次晚會的嘉賓有計算機學院黨委副書記兼紀委書記郭坤銀、黨委組織員劉霜、2016級輔導員李若菡老師、2017級輔導員古曦老師、2018級輔導員鄭田青老師、2019級輔導員謝璧如老師。本次晚會的主…

[轉貼]Cocos2d-x3.2與OpenGL渲染總結(一)Cocos2d-x3.2的渲染流程

看了opengles有一段時間了,算是了解了一下下。然后,就在基本要決定還是回歸cocos2dx 3.2的,看了這篇好文章,欣喜轉之~ 推薦看原帖: Cocos2d-x3.2與OpenGL渲染總結(一)Cocos2d-x3.2的渲染流程 最近幾天,我都…

省賽熱身賽之Median

原題: Description A median is described as the numeric value separating the higher half of a list, from the lower half. The median of a finite list of numbers can be found by arranging all the elements from lowest value to highest value and pick…

win32 段寄存器怎么尋址

32位cpu 地址線擴展成了32位,這和數據線的寬度是一致的。因此,在32位機里其實并不需要采用“物理地址段:偏移”這種地址表達方式。原來在16位機里規定的 每一個段不大于64kb在32位機里也不是必要的。所以,對于32位機來講&#xff…

聯想拯救者y7000p加內存條_筆記本怎么升級內存和硬盤 聯想Y7000P加裝內存和硬盤圖文教程 (全文)...

一般目前新買的筆記本電腦,大都是標配8GB內存和單塊固態硬盤,內存和硬盤容量適中,但對于一些制圖設計、偏大型游戲,又或者對硬盤存儲要求比較高的用戶來說,顯然就不太夠用,這時候我們一般會通過升級內存和硬盤來解決。那么,筆記本怎么升級內存和硬盤?下面以聯想Y7000P筆…