JS浮點數精度問題

在JavaScript開發中,浮點數精度問題是一個常見的陷阱。本文將深入探討JavaScript中浮點數精度問題的原因、影響以及解決方案。

一、浮點數精度常見問題

(一)加法運算

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

(五)四舍五入保留小數位數

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

二、為什么會有這樣的問題

(一)浮點數的存儲方式

在JavaScript中,所有數字都以64位浮點數形式存儲,即使整數也是如此。這種存儲方式基于IEEE 754標準,其中64位的劃分如下:

  • 符號位(1位):表示正負數,0表示正數,1表示負數。
  • 指數位(11位):表示次方數。
  • 尾數位(52位):存儲小數部分,超出部分自動進一舍零。

(二)二進制表示的局限性

浮點數在計算機中以二進制形式存儲,但某些十進制小數無法精確表示為二進制小數。例如,0.1和0.2在二進制中是無限循環小數,因此在存儲時會被截斷,導致精度丟失。

(三)JavaScript的Number類型

JavaScript中的Number類型統一按浮點數處理,整數也是按最大54位來計算的。因此,當數值超過安全范圍(Number.MAX_SAFE_INTEGERNumber.MIN_SAFE_INTEGER)時,就會出現精度問題。

三、解決方案

(一)使用第三方庫

為了精確處理浮點數運算,可以使用一些成熟的第三方庫,如Math.jsdecimal.jsbig.js

Math.js

Math.js是一個功能強大的數學庫,支持多種數據類型和操作。

const math = require('mathjs');
console.log(math.add(0.1, 0.2)); // 0.3
decimal.js

decimal.js提供任意精度的十進制數值運算。

const Decimal = require('decimal.js');
console.log(new Decimal(0.1).plus(0.2).toNumber()); // 0.3
big.js

big.js專注于大數運算,支持高精度的浮點數運算。

const Big = require('big.js');
console.log(new Big(0.1).plus(0.2).toString()); // "0.3"

(二)自定義函數

如果不想引入第三方庫,可以編寫自定義函數來處理浮點數運算。以下是一個簡單的加法函數示例:

function add(a, b) {const factor = 10 ** 10;return (Math.round(a * factor) + Math.round(b * factor)) / factor;
}
console.log(add(0.1, 0.2)); // 0.3

(三)避免浮點數運算

在某些情況下,可以避免直接使用浮點數運算。例如,處理貨幣時,可以將金額轉換為整數(如分)進行計算,最后再轉換回浮點數。

function addCents(a, b) {return (Math.round(a * 100) + Math.round(b * 100)) / 100;
}
console.log(addCents(0.1, 0.2)); // 0.3

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

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

相關文章

本地Markdown開源知識庫選型指南

本地Markdown開源知識庫選型指南 以下是幾款優秀的本地Markdown開源知識庫解決方案,適合不同需求場景: 1. Obsidian (非完全開源但免費) 特點:基于Markdown的本地優先知識管理,豐富的插件生態優勢:雙向鏈接、圖形視…

蘇州SAP代理公司排名:工業園區企業推薦的服務商

目錄 一、SAP實施商選擇標準體系 1、行業經驗維度 2、實施方法論維度 3、資質認證維度 4、團隊實力維度 二、SAP蘇州實施商工博科技 1、SAP雙重認證,高等院校支持 2、以SAP ERP為核心,助力企業數字化轉型 三、蘇州使用SAP的企業 蘇州是中國工業…

springboot項目下面的單元測試注入的RedisConnectionFactory類redisConnectionFactory值為什么為空呢?

你遇到的問題是: RedisConnectionFactory redisConnectionFactory 在單元測試中為 null 這是 Spring Boot 單元測試中非常常見的問題,根本原因是你的測試類沒有啟用 Spring 容器上下文,導致 Resource 注解無法注入 Bean。 ? 正確做法&…

光電學、計算機科學及算法國際會議(OCSA 2025)征稿啟事?

在科技浪潮奔涌向前的當下,光電學、計算機科學及算法領域的創新成果不斷涌現,持續重塑著各個行業的格局,深刻影響著我們的生活。為了進一步促進該領域的學術交流與合作,匯聚全球智慧,光電學、計算機科學及算法國際會議…

小樣本分類新突破:QPT技術詳解

問題導向式提示調優(QPT) 這篇論文主要講了一個針對小樣本(數據量少)文本分類問題的新方法,叫問題導向式提示調優(QPT)。 核心思路是讓預訓練語言模型(比如BERT的升級版RoBERTa)在少量標注數據下,通過設計特定的“提問式模板”和“標簽詞擴展技術”來提升分類效果。…

Oracle EBS 12.1 處理ISG 發布的wsdl 被請求時遇到500錯誤

Oracle 12.1.3 通過ISG 發布了一個服務,該服務在被頻繁調用的時候,出現500 錯誤,臨時解決方案是可以通過重啟oafm組件解決,但是需要定位原因。 排查日志路徑 $INST_TOP/logs/ora/10.1.3/opmn/default_group~oafm~default_group~1…

shadcn/ui

文章目錄 前言? 核心特點📦 支持組件(常用)🚀 安裝使用(框架支持)初始化(Next.js 項目為例)添加一個組件 🧠 對比其他組件庫📘 官方資源? 總結? 功能特性&…

力扣每日一題——找到離給定兩個節點最近的節點

目錄 題目鏈接:2359. 找到離給定兩個節點最近的節點 - 力扣(LeetCode) 題目描述 解法一:雙指針路徑交匯法? 基本思路 關鍵步驟 為什么這樣可行呢我請問了? 舉個例子 特殊情況 Java寫法: C寫法&a…

Termux可用中間人網絡測試工具Xerosploit

Termux可用中間人網絡測試工具Xerosploit。 Xerosploit 是一款基于 MITM 的本地網絡滲透測試工具包。 食用方法: git clone https://github.com/LionSec/xerosploit cd xerosploit sudo python3 install.py 運行: sudo xerosploit 使用備注&#xff1…

vue3 導出excel

需求&#xff1a;導出自帶格式的excel表格 1.自定義二維數組格式 導出 全部代碼&#xff1a; <el-button click"exportExcel">導出</el-button> const exportExcel () > {const data [[商品, 單價, 數量, 總價],[A, 100, 1.55, { t: n, f: B2*C2…

【SQL】關鍵字

ORDER BY ORDER BY(排序) 語句可以按照一個或多個列的值進行升序&#xff08;ASC&#xff09;或降序&#xff08;DESC&#xff09;排序。 MAX / MIN MAX() 函數返回一組值中的最大值。這個函數常用于數字字段&#xff0c;但也可以用于文本字段來找出按字典順序最后的元素。 …

深度學習篇---OC-SORT實際應用效果

OC-SORT 算法在實際應用中的效果可從準確性、魯棒性、效率三個核心維度評估,其表現與傳統多目標跟蹤算法(如 SORT、DeepSORT)相比有顯著提升,尤其在復雜場景中優勢突出。以下是具體分析: 一、準確性:目標關聯更可靠 1. 遮擋場景下的 ID 保持能力 優勢表現: 傳統算法(…

處理知識庫文件_編寫powershell腳本文件_批量轉換其他格式文件到pdf文件---人工智能工作筆記0249

最近在做部門知識庫&#xff0c;選用的dify&#xff0c;作為rag的工具&#xff0c;但是經過多個對比&#xff0c;最后發現&#xff0c; 比較好用的是&#xff0c;納米搜索&#xff0c;但是可惜納米搜索無法在內網使用&#xff0c;無法把知識庫放到本地&#xff0c;導致 有信息…

NSSCTF [NISACTF 2022]ezheap

2058.[NISACTF 2022]ezheap(堆溢出) [NISACTF 2022]ezheap 1.準備 2.ida分析 main函數 int __cdecl main(int argc, const char **argv, const char **envp) {char *command; // [esp8h] [ebp-10h]char *s; // [espCh] [ebp-Ch]setbuf(stdin, 0);setbuf(stdout, 0);s (cha…

微信小店推客系統達人用戶管理的數據支持和便利

達人粉絲畫像關聯&#xff1a;系統通過技術手段&#xff0c;一定程度上獲取達人粉絲的畫像數據&#xff0c;如年齡分布、性別比例、地域分布、消費偏好等。運營者可以根據這些粉絲畫像&#xff0c;為達人匹配更符合其粉絲需求的商品。例如&#xff0c;若某達人的粉絲以年輕女性…

LeetCode 215:數組中的第K個最大元素 - 兩種高效解法詳解

文章目錄 問題描述解法一&#xff1a;快速選擇算法&#xff08;QuickSelect&#xff09;算法思想算法步驟Java實現復雜度分析算法特點 解法二&#xff1a;最小堆&#xff08;優先隊列&#xff09;算法思想算法步驟Java實現復雜度分析算法特點 兩種解法比較測試示例總結 在算法面…

視頻壓制(Video Encoding/Compression)

視頻壓制是指通過特定的算法和技術&#xff0c;將原始視頻文件轉換為更小體積或更適合傳播的格式的過程。其核心目的是在盡量保持畫質的前提下&#xff0c;減少視頻的文件大小&#xff0c;或適配不同播放設備、網絡環境的需求。 --- ### **關鍵概念解析** 1. **為什么需要壓制…

如何做好一個決策:基于 Excel的決策樹+敏感性分析應用

決策點: 開發新產品? (是 / 否) 因素 (如果是): 市場接受度 (高 / 中 / 低);概率: 高(0.3), 中(0.5), 低(0.2) 結果值 (NPV): 高(+$1M), 中(+$0.2M), 低(-$0.5M) 不開發成本/收益: $0 開發計算: EMV(市場接受度) = (0.3 * 1M) + (0.5 * 0.2M) + (0.2 * -0.5M) = $0.3M + $…

Java中的設計模式實戰:單例、工廠、策略模式的最佳實踐

Java中的設計模式實戰&#xff1a;單例、工廠、策略模式的最佳實踐 在Java開發中&#xff0c;設計模式是構建高效、可維護、可擴展應用程序的關鍵。本文將深入探討三種常見且實用的設計模式&#xff1a;單例模式、工廠模式和策略模式&#xff0c;并通過詳細代碼實例&#xff0…

PyTorch學習(1):張量(Tensor)核心操作詳解

PyTorch學習(1)&#xff1a;張量&#xff08;Tensor&#xff09;核心操作詳解 一、張量&#xff08;Tensor&#xff09;核心操作詳解 張量是PyTorch的基礎數據結構&#xff0c;類似于NumPy的ndarray&#xff0c;但支持GPU加速和自動微分。 1. 張量創建與基礎屬性 import to…