欧美成人精品手机在线观看_69视频国产_动漫精品第一页_日韩中文字幕网 - 日本欧美一区二区

LOGO OA教程 ERP教程 模切知識交流 PMS教程 CRM教程 開發文檔 其他文檔  
 
網站管理員

[點晴永久免費OA]關于 js 中的精度丟失問題

freeflydom
2023年6月26日 11:31 本文熱度 960

前言

在 Javascript 中,由于采用了 IEEE 754 標準的浮點數表示方法,可能會導致精度丟失問題。這主要是因為浮點數在內存中以二進制的形式存儲,而某些十進制數無法精確地轉換成二進制表示。當進行計算時,就會出現舍入誤差。

例如以下示例:


結果不精確是因為 0.1 和 0.2 無法用二進制無法精確地表示出來,進行運算時也會存在誤差。

本文將以此為例,從二進制轉化,存儲到計算來分析造成這一結果的根本原因,文章篇幅不多,希望看完后可以給你帶來一些收獲......

如何轉化?

首先我們要清楚整數和小數是如何轉化為二進制的。

整數部分:除2取余 + 逆序排列,示例如下:

8 / 2 = 4 ...... 0

4 / 2 = 2 ...... 0

2 / 2 = 1 ...... 0

1 / 2 = 0 ...... 1


整數 8 轉化為二進制的結果是:1000

小數部分:乘2取整 + 順序排列,示例如下:

0.1 * 2 = 0.2 ...... 0

0.2 * 2 = 0.4 ...... 0

0.4 * 2 = 0.8 ...... 0

0.8 * 2 = 1.6 ...... 1

0.6 * 2 = 1.2 ...... 1

0.2 * 2 = 0.4 ...... 0

...


小數 0.1 轉化為二進制的結果是:0.0001100110011...

如何存儲?

js 中 Number 類型使用 IEEE 754 標準 64 位存儲,為每個數值分配 64 位存儲空間,以科學計數法的方式進行存儲。形式如下:

1.xxxxxx * 2 ^ n 



64位存儲空間分為3個部分,包括 符號位指數位小數位,如下圖所示:


符號位占 1 位,標記數值的正負,0 表示正數,1 表示負數。

指數位占 11 位,值為一個固定值 1023 (IEEE 754 標準) + 科學計數法中的指數值,再將其轉為 11 位二進制。比如 0.1 = 0.00011001... = 1.1001... * 2 ^ (-4),指數位就為 1023 + (-4) = 1019,用 11 位二進制表示為 01111111011

小數位占 52 位,用來存放小數點后的數值,以 0.1 為例,由于小數位只能存儲 52 位,又因為第 53 位為 1,所以截取需要往前進一位再保存,這里就造成了第一次的精度丟失。

相同的道理,所以 0.1 和 0.2 在內存中就是這樣的:

如何計算?

最后就是將 64 位雙精度浮點數相加,首先我們把偏移量還原對齊,再進行相加,如下圖所示:


相加后發現小數部分有 53 位,由于小數位只能存儲 52 位,因此需要再次進行截取,這里就造成了第二次的精度丟失。將這個結果轉化為十進制就得到了一開始我們打印的結果。

這也就是為什么 0.1 + 0.2 不等于 0.3 的原因。

解決方法

可以使用一些第三方庫來解決,例如:

  • bignumber.js:提供了超高精度的數字處理能力,可以解決精度丟失問題。官方文檔

  • decimal.js:可以精確表示浮點數,解決精度丟失問題。官方文檔

總結

  1. js 用二進制處理數據,用 IEEE 754 雙精度浮點數標準存儲 Number 類型。

  2. 精度丟失是由于 IEEE 754 標準存儲位有限導致的。

  3. 過程中會有兩次精度丟失,一次在存儲,一次在相加。


原文鏈接



該文章在 2023/6/26 11:32:06 編輯過
關鍵字查詢
相關文章
正在查詢...
點晴ERP是一款針對中小制造業的專業生產管理軟件系統,系統成熟度和易用性得到了國內大量中小企業的青睞。
點晴PMS碼頭管理系統主要針對港口碼頭集裝箱與散貨日常運作、調度、堆場、車隊、財務費用、相關報表等業務管理,結合碼頭的業務特點,圍繞調度、堆場作業而開發的。集技術的先進性、管理的有效性于一體,是物流碼頭及其他港口類企業的高效ERP管理信息系統。
點晴WMS倉儲管理系統提供了貨物產品管理,銷售管理,采購管理,倉儲管理,倉庫管理,保質期管理,貨位管理,庫位管理,生產管理,WMS管理系統,標簽打印,條形碼,二維碼管理,批號管理軟件。
點晴免費OA是一款軟件和通用服務都免費,不限功能、不限時間、不限用戶的免費OA協同辦公管理系統。
Copyright 2010-2025 ClickSun All Rights Reserved