前端精度問題全解析:用“挖掘機”快速“填平精度坑”的完美解決方案

寫在前面

“為什么我的計算在 React Native 中總是出現奇怪的精度問題?” —— 這可能是許多開發者在作前端程序猿的朋友們都會遇到的第一個頭疼問題。本文將深入探討前端精度問題的根源,我將以RN為例,并提供一系列實用解決方案,讓你的應用告別計算誤差。

一、精度問題的根源:JavaScript 的浮點數陷阱

1.1 JavaScript 的數字表示方式

在 React Native 中,我們使用的是 JavaScript 的數字系統,而 JavaScript 遵循 IEEE 754 標準,采用雙精度浮點數(64位)表示所有數字。這意味著:

  • 整數和浮點數沒有區別
  • 所有數字都以二進制浮點數形式存儲
  • 最大安全整數是 2^53 - 1(即 9007199254740991)
console.log(0.1 + 0.2); // 輸出:0.30000000000000004

這個經典例子完美展示了浮點數精度問題。不是 JavaScript 的 bug,而是二進制浮點數運算的固有特性。

1.2 React Native 中的特殊場景

在 React Native 開發中,精度問題尤其突出在:

  • 金融計算:金額計算不容許誤差
  • 科學計算:需要高精度結果
  • 地理位置:經緯度計算
  • 動畫效果:流暢的動畫需要精確計算

二、常見精度問題場景分析

2.1 簡單算術運算的陷阱

// 看似簡單的計算,卻暗藏玄機
const calculateTotal = (price, quantity) => {return price * quantity;
};console.log(calculateTotal(0.1, 0.2)); // 0.020000000000000004

2.2 比較操作的不可靠性

// 永遠不要直接比較浮點數
const a = 0.1 + 0.2;
const b = 0.3;console.log(a === b); // false

2.3 數據序列化的精度丟失

// 服務器返回的JSON數據
const response = {amount: 12345678901234567890
};console.log(response.amount); // 12345678901234567000

三、基礎解決方案:Number 的極限

3.1 使用 toFixed() 進行格式化

const result = (0.1 + 0.2).toFixed(2);
console.log(result); // "0.30" (注意返回的是字符串)

注意事項

  • 返回的是字符串,不是數字
  • 四舍五入可能不符合金融計算要求
  • 不能解決計算過程中的精度問題

3.2 使用 Math.round 進行整數運算

// 將小數轉換為整數運算
const calculate = (a, b) => {const multiplier = Math.pow(10, 2); // 保留2位小數return (a * multiplier + b * multiplier) / multiplier;
};console.log(calculate(0.1, 0.2)); // 0.3

優點

  • 避免了部分浮點數問題
  • 結果相對準確

缺點

  • 操作繁瑣
  • 仍然有精度限制

四、進階解決方案:第三方庫的力量

4.1 decimal.js —— 高精度數學計算

npm install decimal.js
import Decimal from 'decimal.js';// 精確計算
const result = new Decimal(0.1).plus(new Decimal(0.2));
console.log(result.toString()); // "0.3"// 復雜運算
const complexCalc = new Decimal(12.345).times(new Decimal(1.2)).dividedBy(new Decimal(3.4)).toFixed(4

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

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

相關文章

2024 睿抗機器人開發者大賽CAIP-編程技能賽-本科組(國賽) 解題報告 | 珂學家

前言 題解 2024 睿抗機器人開發者大賽CAIP-編程技能賽-本科組(國賽)。 國賽比省賽難一些,做得汗流浹背,T_T. RC-u1 大家一起查作弊 分值: 15分 這題真的太有意思,看看描述 在今年的睿抗比賽上,有同學的提交代碼如下&#xff1…

hghac和hgproxy版本升級相關操作和注意事項

文章目錄 環境文檔用途詳細信息 環境 系統平臺:N/A 版本:4.5.6,4.5.7,4.5.8 文檔用途 本文檔用于高可用集群環境中hghac組件和hgproxy組件替換和升級操作 詳細信息 1.關閉服務 所有數據節點都執行 1、關閉hgproxy服務 [roothgdb01 tools]# system…

userfaultfd內核線程D狀態問題排查

問題現象 運維反應機器上出現了很多D狀態進程,也kill不掉,然后將現場保留下來進行排查。 排查過程 都是內核線程,先看下內核棧D在哪了,發現D在了userfaultfd的pagefault流程。 uffd知識補充 uffd探究 uffd在firecracker與e2b的架構下使…

深入解析:構建高性能異步HTTP客戶端的工程實踐

一、架構設計原理與核心優勢 HTTP/2多路復用技術的本質是通過單一的TCP連接并行處理多個請求/響應流,突破了HTTP/1.1的隊頭阻塞限制。在異步編程模型下,這種特性與事件循環機制完美結合,形成了高性能網絡通信的黃金組合。相較于傳統同步客戶…

根據臺賬批量制作個人表

1. 前期材料準備 1)要有 人員總的信息臺賬 2)要有 個人明白卡模板 2. 開始操作 1)打開 人員總的信息臺賬,選擇所需要的數據模塊; 2)點擊插入,選擇數據透視表,按流程操作&…

《AI大模型應知應會100篇》第65篇:基于大模型的文檔問答系統實現

第65篇:基于大模型的文檔問答系統實現 📚 摘要:本文詳解如何構建一個基于大語言模型(LLM)的文檔問答系統,支持用戶上傳 PDF 或 Word 文檔,并根據其內容進行智能問答。從文檔解析、向量化、存儲到…

RTK哪個品牌好?2025年RTK主流品牌深度解析

在測繪領域,RTK 技術的發展日新月異,選擇一款性能卓越、穩定可靠的 RTK 設備至關重要。2025 年,市場上涌現出眾多優秀品牌,本文將深入解析幾大主流品牌的核心競爭力。 華測導航(CHCNAV):技術創…

SpringCloud微服務開發與實戰

本節內容帶你認識什么是微服務的特點,微服務的拆分,會使用Nacos實現服務治理,會使用OpenFeign實現遠程調用(通過黑馬商城來帶你了解實際開發中微服務項目) 前言:從谷歌搜索指數來看,國內從自201…

pgsql14自動創建表分區

最近有pgsql的分區表功能需求,沒想到都2025年了,pgsql和mysql還是沒有自身支持自動創建分區表的功能 現在pgsql數據庫層面還是只能用老三樣的辦法來處理這個問題,每個方法各有優劣 1. 觸發器 這是最傳統的方法,通過創建一個觸發…

math toolkit for real-time development讀書筆記一三角函數快速計算(1)

一、基礎知識 根據高中知識我們知道,很多函數都可以用泰勒級數展開。正余弦泰勒級數展開如下: 將其進一步抽象為公式可知: 正弦和余弦的泰勒級數具有高度結構化的模式,可拆解為以下核心特征: 1. 符號交替特性 正弦級…

uni-app 中適配 App 平臺

文章目錄 前言? 1. App 使用的 Runtime 架構:**WebView 原生容器(plus runtime)**📌 技術棧核心: ? 2. WebView Native 的通信機制詳解(JSBridge)📤 Web → Native 調用&#xf…

SpringBoot基礎(靜態資源導入)

靜態資源導入 在WebMvcAutoConfiguration自動配置類中 有一個添加資源的方法: public void addResourceHandlers(ResourceHandlerRegistry registry) { //如果靜態資源已經被自定義了,則直接生效if (!this.resourceProperties.isAddMappings()) {logg…

基于OpenCV的人臉識別:LBPH算法

文章目錄 引言一、概述二、代碼實現1. 代碼整體結構2. 導入庫解析3. 訓練數據準備4. 標簽系統5. 待識別圖像加載6. LBPH識別器創建7. 模型訓練8. 預測執行9. 結果輸出 三、 LBPH算法原理解析四、關鍵點解析五、改進方向總結 引言 人臉識別是計算機視覺領域的一個重要應用&…

ElasticSearch重啟之后shard未分配問題的解決

以下是Elasticsearch重啟后分片未分配問題的完整解決方案,結合典型故障場景與最新實踐: 一、快速診斷定位 ?檢查集群狀態 GET /_cluster/health?pretty # status為red/yellow時需關注unassigned_shards字段值 ? 2.查看未分配分片詳情 …

CSS- 3.1 盒子模型-塊級元素、行內元素、行內塊級元素和display屬性

本系列可作為前端學習系列的筆記,代碼的運行環境是在HBuilder中,小編會將代碼復制下來,大家復制下來就可以練習了,方便大家學習。 HTML系列文章 已經收錄在前端專欄,有需要的寶寶們可以點擊前端專欄查看! 點…

Git/GitLab日常使用的命令指南來了!

在 GitLab 中拉取并合并代碼的常見流程是通過 Git 命令來完成的。以下是一個標準的 Git 工作流,適用于從遠程倉庫(如 GitLab)拉取代碼、切換分支、合并更新等操作。 🌐 一、基礎命令:拉取最新代碼 # 拉取遠程倉庫的所…

HTML 表格與div深度解析區別及常見誤區

一、HTML<div>元素詳解 <div>是HTML中最基本的塊級容器元素&#xff0c;本身沒有語義&#xff0c;主要用于組織和布局頁面內容。以下是其核心用法&#xff1a; 1. 基礎結構與特性 <div><!-內部可包含任意HTML元素 --><h2>標題</h2><p…

mybatisPlus 新增時 其他字段的值和 id 保持一致實現方法

MyBatis-Plus 實現 sp_id_path 與 id 同步的方案 要實現新增時 sp_id_path 自動與 id 保持一致&#xff0c;需要在實體類和插入邏輯中做相應處理。MyBatis-Plus 提供了幾種方式來實現這一需求&#xff1a; 方案一&#xff1a;使用 MyBatis-Plus 的自動填充功能 這是最優雅的…

蘭亭妙微設計:為生命科技賦予人性化的交互語言

在醫療科技日新月異的今天&#xff0c;卓越的硬件性能唯有匹配恰如其分的交互語言&#xff0c;方能真正發揮價值。作為專注于醫療UI/UX設計的專業團隊&#xff0c;蘭亭妙微設計&#xff08;www.lanlanwork.com&#xff09;始終相信&#xff1a;每一處像素的排布&#xff0c;都應…

Tcping詳細使用教程

Tcping詳細使用教程 下載地址 https://download.elifulkerson.com/files/tcping/0.39/在windows環境下安裝tcping 在以上的下載地中找到exe可執行文件&#xff0c;其中tcping.exe適用于32位Windows系統&#xff0c;tcping64.exe適用于64位Windows操作系統。 其實tcping是個…