日韩欧美人妻无码精品白浆,夜夜嗨AV免费入口,国产欧美官网在线看,高校回应聋哑女生因长相完美被质疑

LOGO OA教程 ERP教程 模切知識(shí)交流 PMS教程 CRM教程 開(kāi)發(fā)文檔 其他文檔  
 
網(wǎng)站管理員

[點(diǎn)晴永久免費(fèi)OA]關(guān)于 js 中的精度丟失問(wèn)題

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

前言

在 Javascript 中,由于采用了 IEEE 754 標(biāo)準(zhǔn)的浮點(diǎn)數(shù)表示方法,可能會(huì)導(dǎo)致精度丟失問(wèn)題。這主要是因?yàn)楦↑c(diǎn)數(shù)在內(nèi)存中以二進(jìn)制的形式存儲(chǔ),而某些十進(jìn)制數(shù)無(wú)法精確地轉(zhuǎn)換成二進(jìn)制表示。當(dāng)進(jìn)行計(jì)算時(shí),就會(huì)出現(xiàn)舍入誤差。

例如以下示例:


結(jié)果不精確是因?yàn)?0.1 和 0.2 無(wú)法用二進(jìn)制無(wú)法精確地表示出來(lái),進(jìn)行運(yùn)算時(shí)也會(huì)存在誤差。

本文將以此為例,從二進(jìn)制轉(zhuǎn)化,存儲(chǔ)到計(jì)算來(lái)分析造成這一結(jié)果的根本原因,文章篇幅不多,希望看完后可以給你帶來(lái)一些收獲......

如何轉(zhuǎn)化?

首先我們要清楚整數(shù)和小數(shù)是如何轉(zhuǎn)化為二進(jìn)制的。

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

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

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

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

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


整數(shù) 8 轉(zhuǎn)化為二進(jìn)制的結(jié)果是:1000

小數(shù)部分:乘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

...


小數(shù) 0.1 轉(zhuǎn)化為二進(jìn)制的結(jié)果是:0.0001100110011...

如何存儲(chǔ)?

js 中 Number 類(lèi)型使用 IEEE 754 標(biāo)準(zhǔn) 64 位存儲(chǔ),為每個(gè)數(shù)值分配 64 位存儲(chǔ)空間,以科學(xué)計(jì)數(shù)法的方式進(jìn)行存儲(chǔ)。形式如下:

1.xxxxxx * 2 ^ n 



64位存儲(chǔ)空間分為3個(gè)部分,包括 符號(hào)位指數(shù)位小數(shù)位,如下圖所示:


符號(hào)位占 1 位,標(biāo)記數(shù)值的正負(fù),0 表示正數(shù),1 表示負(fù)數(shù)。

指數(shù)位占 11 位,值為一個(gè)固定值 1023 (IEEE 754 標(biāo)準(zhǔn)) + 科學(xué)計(jì)數(shù)法中的指數(shù)值,再將其轉(zhuǎn)為 11 位二進(jìn)制。比如 0.1 = 0.00011001... = 1.1001... * 2 ^ (-4),指數(shù)位就為 1023 + (-4) = 1019,用 11 位二進(jìn)制表示為 01111111011。

小數(shù)位占 52 位,用來(lái)存放小數(shù)點(diǎn)后的數(shù)值,以 0.1 為例,由于小數(shù)位只能存儲(chǔ) 52 位,又因?yàn)榈?53 位為 1,所以截取需要往前進(jìn)一位再保存,這里就造成了第一次的精度丟失。

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

如何計(jì)算?

最后就是將 64 位雙精度浮點(diǎn)數(shù)相加,首先我們把偏移量還原對(duì)齊,再進(jìn)行相加,如下圖所示:


相加后發(fā)現(xiàn)小數(shù)部分有 53 位,由于小數(shù)位只能存儲(chǔ) 52 位,因此需要再次進(jìn)行截取,這里就造成了第二次的精度丟失。將這個(gè)結(jié)果轉(zhuǎn)化為十進(jìn)制就得到了一開(kāi)始我們打印的結(jié)果。

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

解決方法

可以使用一些第三方庫(kù)來(lái)解決,例如:

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

  • decimal.js:可以精確表示浮點(diǎn)數(shù),解決精度丟失問(wèn)題。官方文檔

總結(jié)

  1. js 用二進(jìn)制處理數(shù)據(jù),用 IEEE 754 雙精度浮點(diǎn)數(shù)標(biāo)準(zhǔn)存儲(chǔ) Number 類(lèi)型。

  2. 精度丟失是由于 IEEE 754 標(biāo)準(zhǔn)存儲(chǔ)位有限導(dǎo)致的。

  3. 過(guò)程中會(huì)有兩次精度丟失,一次在存儲(chǔ),一次在相加。


原文鏈接



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