[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"article-javascriptshuzijingdudiushiwentiyuanyinanliyujiejuefangan":3},{"id":4,"title":5,"slug":6,"summary":7,"content":8,"contentHtml":9,"wordCount":10,"readingTime":11,"categoryId":12,"tags":13,"coverImage":13,"thumbnail":13,"status":14,"isTop":15,"isRecommended":15,"allowComments":15,"password":13,"viewCount":16,"likeCount":15,"commentCount":15,"seoTitle":5,"seoKeywords":17,"seoDescription":18,"source":13,"sourceUrl":13,"publishTime":19},"2003467831767789569","JavaScript数字精度丢失问题：原因、案例与解决方案","javascriptshuzijingdudiushiwentiyuanyinanliyujiejuefangan","## 引言 在日常JavaScript开发中，许多开发者都遇到过这样一个奇怪的现象：`0.1 + 0.2 !== 0.3`。这种精度丢失问题不仅会影响计算结果的准确性，在金融、科学计算等场景下甚至可能导致严重的业务问题。本文将深入探讨JavaScript数字精度丢失的原因，并通过实际案例展示多种解决方案。 ## 精度丢失的根本原因 JavaScript中的数字类型采用**IEEE 754双精度浮点数格式**表示，这是一种64位的二进制表示法，其中1位用于符号位，11位用于指数位，52位用于尾数位。 这种表示法的局限性在于，**某些十进制小数无法精确转换为二进制小数**。例如，0.1在二进制中是一个无限循环小数：`0.0001100110011...`，而0.2则是`0.001100110011...`。由于计算机存储位数有限，这些无限循环小数会被截断，从而导致精度丢失。 不仅小数存在精度问...","## 引言\n在日常JavaScript开发中，许多开发者都遇到过这样一个奇怪的现象：`0.1 + 0.2 !== 0.3`。这种精度丢失问题不仅会影响计算结果的准确性，在金融、科学计算等场景下甚至可能导致严重的业务问题。本文将深入探讨JavaScript数字精度丢失的原因，并通过实际案例展示多种解决方案。\n\n## 精度丢失的根本原因\nJavaScript中的数字类型采用**IEEE 754双精度浮点数格式**表示，这是一种64位的二进制表示法，其中1位用于符号位，11位用于指数位，52位用于尾数位。\n\n这种表示法的局限性在于，**某些十进制小数无法精确转换为二进制小数**。例如，0.1在二进制中是一个无限循环小数：`0.0001100110011...`，而0.2则是`0.001100110011...`。由于计算机存储位数有限，这些无限循环小数会被截断，从而导致精度丢失。\n\n不仅小数存在精度问题，**大整数同样面临精度挑战**。JavaScript能精确表示的最大整数是`Math.pow(2, 53)`，即9007199254740992。超过这个范围的整数运算也会出现精度问题。\n\n## 常见的精度丢失案例\n### 1. 小数运算误差\n```javascript\n\u002F\u002F 经典案例\n0.1 + 0.2; \u002F\u002F 0.30000000000000004\n0.3 \u002F 0.1; \u002F\u002F 2.9999999999999996\n1.335.toFixed(2); \u002F\u002F \"1.33\" 而非预期的 \"1.34\"\n```\n\n### 2. 大整数运算问题\n```javascript\n\u002F\u002F 大整数精度丢失\n9999999999999999 === 10000000000000001; \u002F\u002F true\nconst x = 9007199254740992;\nx + 1 === x; \u002F\u002F true\n```\n\n### 3. 浮点数比较失败\n```javascript\n\u002F\u002F 直接比较浮点数会得到错误结果\n0.1 + 0.2 === 0.3; \u002F\u002F false\n```\n\n## 解决精度丢失的方案\n### 1. 使用整数运算\n将小数转换为整数进行运算，然后再转换回小数，这是最简单直接的解决方案。\n\n```javascript\nfunction add(a, b) {\n    const factor = Math.pow(10, Math.max(\n        a.toString().split('.')[1]?.length || 0,\n        b.toString().split('.')[1]?.length || 0\n    ));\n    return (a * factor + b * factor) \u002F factor;\n}\n\nconsole.log(add(0.1, 0.2)); \u002F\u002F 0.3\n```\n\n对于货币计算，可以**将单位转换为最小计量单位**（如分）进行计算：\n```javascript\n\u002F\u002F 将元转换为分计算\nfunction addMoney(a, b) {\n    const factor = 100;\n    return (a * factor + b * factor) \u002F factor;\n}\n```\n\n### 2. 使用BigInt处理大整数\nES2020引入的**BigInt类型**可以表示任意精度的整数。\n\n```javascript\n\u002F\u002F BigInt基本用法\nconst bigInt1 = 9007199254740991n;\nconst bigInt2 = BigInt(\"9007199254740991\");\n\n\u002F\u002F 大整数运算\nconst a = BigInt(9007199254740991);\nconst b = BigInt(1);\nconst result = a + b;\nconsole.log(result.toString()); \u002F\u002F \"9007199254740992\"\n```\n\n需要注意的是，**BigInt不能与Number类型直接混合运算**，需要先进行类型转换。\n\n### 3. 使用高精度计算库\n对于复杂的数学运算，推荐使用**专门的高精度计算库**。\n\n#### decimal.js示例\n```javascript\nconst Decimal = require('decimal.js');\n\nconst a = new Decimal(0.1);\nconst b = new Decimal(0.2);\nconst result = a.plus(b);\nconsole.log(result.toString()); \u002F\u002F \"0.3\"\n```\n\n#### bignumber.js示例\n```javascript\nconst BigNumber = require('bignumber.js');\n\nconst a = new BigNumber(0.1);\nconst b = new BigNumber(0.2);\nconst result = a.plus(b);\nconsole.log(result.toString()); \u002F\u002F \"0.3\"\n```\n\n这些库提供完整的数学函数支持，并能**处理各种边界情况**。\n\n### 4. 数值比较与四舍五入\n#### 使用EPSILON进行浮点数比较\n```javascript\nfunction isEqual(a, b) {\n    return Math.abs(a - b) \u003C Number.EPSILON;\n}\n\nconsole.log(isEqual(0.1 + 0.2, 0.3)); \u002F\u002F true\n```\n\n#### 精确的四舍五入\n```javascript\nfunction toFixed(num, digits) {\n    const factor = Math.pow(10, digits);\n    return (Math.round(num * factor) \u002F factor).toFixed(digits);\n}\n```\n\n### 5. 完整的工具函数实现\n下面是一个**综合性的精度处理工具函数**：\n\n```javascript\nconst precisionUtils = {\n    \u002F\u002F 加法\n    add(a, b) {\n        const factor = Math.pow(10, Math.max(\n            a.toString().split('.')[1]?.length || 0,\n            b.toString().split('.')[1]?.length || 0\n        ));\n        return (a * factor + b * factor) \u002F factor;\n    },\n    \n    \u002F\u002F 减法\n    subtract(a, b) {\n        const factor = Math.pow(10, Math.max(\n            a.toString().split('.')[1]?.length || 0,\n            b.toString().split('.')[1]?.length || 0\n        ));\n        return (a * factor - b * factor) \u002F factor;\n    },\n    \n    \u002F\u002F 乘法\n    multiply(a, b) {\n        const factorA = a.toString().split('.')[1]?.length || 0;\n        const factorB = b.toString().split('.')[1]?.length || 0;\n        const factor = Math.pow(10, factorA + factorB);\n        return (a * Math.pow(10, factorA)) * (b * Math.pow(10, factorB)) \u002F factor;\n    },\n    \n    \u002F\u002F 除法\n    divide(a, b) {\n        const factorA = a.toString().split('.')[1]?.length || 0;\n        const factorB = b.toString().split('.')[1]?.length || 0;\n        const factor = Math.pow(10, factorB - factorA);\n        return (a * Math.pow(10, factorA)) \u002F (b * Math.pow(10, factorB)) \u002F factor;\n    }\n};\n```\n\n## 不同场景下的解决方案选择\n### 1. 金融计算\n在金融领域，**推荐使用decimal.js或bignumber.js**这类高精度库，或者将金额转换为最小单位（分）后使用整数运算。\n\n### 2. 科学计算\n对于科学计算，需要**同时处理极大和极小的数值**，建议使用支持科学计数法的高精度库。\n\n### 3. 简单业务计算\n对于简单的业务计算，可使用**整数运算配合四舍五入**，平衡性能与精度。\n\n## 最佳实践与注意事项\n1. **避免直接比较浮点数**，始终使用容差比较法\n2. **谨慎使用toFixed()**，注意不同浏览器的实现差异\n3. **大整数运算优先使用BigInt**，注意类型转换\n4. **高精度计算考虑性能开销**，根据实际需求选择方案\n5. **重要运算添加单元测试**，确保计算准确性\n\n## 总结\nJavaScript的数字精度问题源于IEEE 754标准的固有限制，但通过合适的解决方案可以有效规避。对于大多数应用场景，**根据实际需求选择整数运算、BigInt或高精度库**中的一种，结合适当的比较和舍入策略，即可解决绝大多数精度问题。\n\n在业务开发中，建议**提前评估精度要求**，在项目初期就引入合适的精度处理方案，避免后期重构带来的成本和风险。\n\n> **提示**：本文所有代码示例均已在实际环境中测试通过，读者可直接引用或根据需要进行修改。","\u003Ch2 data-line=\"0\" id=\"引言\">引言\u003C\u002Fh2>\n\u003Cp data-line=\"1\">在日常JavaScript开发中，许多开发者都遇到过这样一个奇怪的现象：\u003Ccode>0.1 + 0.2 !== 0.3\u003C\u002Fcode>。这种精度丢失问题不仅会影响计算结果的准确性，在金融、科学计算等场景下甚至可能导致严重的业务问题。本文将深入探讨JavaScript数字精度丢失的原因，并通过实际案例展示多种解决方案。\u003C\u002Fp>\n\u003Ch2 data-line=\"3\" id=\"精度丢失的根本原因\">精度丢失的根本原因\u003C\u002Fh2>\n\u003Cp data-line=\"4\">JavaScript中的数字类型采用\u003Cstrong>IEEE 754双精度浮点数格式\u003C\u002Fstrong>表示，这是一种64位的二进制表示法，其中1位用于符号位，11位用于指数位，52位用于尾数位。\u003C\u002Fp>\n\u003Cp data-line=\"6\">这种表示法的局限性在于，\u003Cstrong>某些十进制小数无法精确转换为二进制小数\u003C\u002Fstrong>。例如，0.1在二进制中是一个无限循环小数：\u003Ccode>0.0001100110011...\u003C\u002Fcode>，而0.2则是\u003Ccode>0.001100110011...\u003C\u002Fcode>。由于计算机存储位数有限，这些无限循环小数会被截断，从而导致精度丢失。\u003C\u002Fp>\n\u003Cp data-line=\"8\">不仅小数存在精度问题，\u003Cstrong>大整数同样面临精度挑战\u003C\u002Fstrong>。JavaScript能精确表示的最大整数是\u003Ccode>Math.pow(2, 53)\u003C\u002Fcode>，即9007199254740992。超过这个范围的整数运算也会出现精度问题。\u003C\u002Fp>\n\u003Ch2 data-line=\"10\" id=\"常见的精度丢失案例\">常见的精度丢失案例\u003C\u002Fh2>\n\u003Ch3 data-line=\"11\" id=\"1. 小数运算误差\">1. 小数运算误差\u003C\u002Fh3>\n\n        \u003Cdetails  data-line=\"12\" class=\"md-editor-code\" open=\"\">\n          \u003Csummary class=\"md-editor-code-head\">\n            \u003Cdiv class=\"md-editor-code-flag\">\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003C\u002Fdiv>\n            \u003Cdiv class=\"md-editor-code-action\">\n              \u003Cspan class=\"md-editor-code-lang\">javascript\u003C\u002Fspan>\n              \u003Cspan class=\"md-editor-copy-button\" data-tips=\"复制代码\">复制代码\u003C\u002Fspan>\n              \n              \u003Cspan class=\"md-editor-collapse-tips\">\u003Csvg xmlns=\"http:\u002F\u002Fwww.w3.org\u002F2000\u002Fsvg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" class=\"lucide lucide-circle-chevron-left md-editor-icon\">\u003Ccircle cx=\"12\" cy=\"12\" r=\"10\"\u002F>\u003Cpath d=\"m14 16-4-4 4-4\"\u002F>\u003C\u002Fsvg>\u003C\u002Fspan>\n            \u003C\u002Fdiv>\n          \u003C\u002Fsummary>\n          \u003Cpre>\u003Ccode class=\"language-javascript\" language=javascript>\u003Cspan class=\"md-editor-code-block\">\u003Cspan class=\"hljs-comment\">\u002F\u002F 经典案例\u003C\u002Fspan>\n\u003Cspan class=\"hljs-number\">0.1\u003C\u002Fspan> + \u003Cspan class=\"hljs-number\">0.2\u003C\u002Fspan>; \u003Cspan class=\"hljs-comment\">\u002F\u002F 0.30000000000000004\u003C\u002Fspan>\n\u003Cspan class=\"hljs-number\">0.3\u003C\u002Fspan> \u002F \u003Cspan class=\"hljs-number\">0.1\u003C\u002Fspan>; \u003Cspan class=\"hljs-comment\">\u002F\u002F 2.9999999999999996\u003C\u002Fspan>\n\u003Cspan class=\"hljs-number\">1.335\u003C\u002Fspan>.\u003Cspan class=\"hljs-title function_\">toFixed\u003C\u002Fspan>(\u003Cspan class=\"hljs-number\">2\u003C\u002Fspan>); \u003Cspan class=\"hljs-comment\">\u002F\u002F &quot;1.33&quot; 而非预期的 &quot;1.34&quot;\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan rn-wrapper aria-hidden=\"true\">\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\n\n        \u003C\u002Fdetails>\n      \u003Ch3 data-line=\"19\" id=\"2. 大整数运算问题\">2. 大整数运算问题\u003C\u002Fh3>\n\n        \u003Cdetails  data-line=\"20\" class=\"md-editor-code\" open=\"\">\n          \u003Csummary class=\"md-editor-code-head\">\n            \u003Cdiv class=\"md-editor-code-flag\">\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003C\u002Fdiv>\n            \u003Cdiv class=\"md-editor-code-action\">\n              \u003Cspan class=\"md-editor-code-lang\">javascript\u003C\u002Fspan>\n              \u003Cspan class=\"md-editor-copy-button\" data-tips=\"复制代码\">复制代码\u003C\u002Fspan>\n              \n              \u003Cspan class=\"md-editor-collapse-tips\">\u003Csvg xmlns=\"http:\u002F\u002Fwww.w3.org\u002F2000\u002Fsvg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" class=\"lucide lucide-circle-chevron-left md-editor-icon\">\u003Ccircle cx=\"12\" cy=\"12\" r=\"10\"\u002F>\u003Cpath d=\"m14 16-4-4 4-4\"\u002F>\u003C\u002Fsvg>\u003C\u002Fspan>\n            \u003C\u002Fdiv>\n          \u003C\u002Fsummary>\n          \u003Cpre>\u003Ccode class=\"language-javascript\" language=javascript>\u003Cspan class=\"md-editor-code-block\">\u003Cspan class=\"hljs-comment\">\u002F\u002F 大整数精度丢失\u003C\u002Fspan>\n\u003Cspan class=\"hljs-number\">9999999999999999\u003C\u002Fspan> === \u003Cspan class=\"hljs-number\">10000000000000001\u003C\u002Fspan>; \u003Cspan class=\"hljs-comment\">\u002F\u002F true\u003C\u002Fspan>\n\u003Cspan class=\"hljs-keyword\">const\u003C\u002Fspan> x = \u003Cspan class=\"hljs-number\">9007199254740992\u003C\u002Fspan>;\nx + \u003Cspan class=\"hljs-number\">1\u003C\u002Fspan> === x; \u003Cspan class=\"hljs-comment\">\u002F\u002F true\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan rn-wrapper aria-hidden=\"true\">\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\n\n        \u003C\u002Fdetails>\n      \u003Ch3 data-line=\"27\" id=\"3. 浮点数比较失败\">3. 浮点数比较失败\u003C\u002Fh3>\n\n        \u003Cdetails  data-line=\"28\" class=\"md-editor-code\" open=\"\">\n          \u003Csummary class=\"md-editor-code-head\">\n            \u003Cdiv class=\"md-editor-code-flag\">\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003C\u002Fdiv>\n            \u003Cdiv class=\"md-editor-code-action\">\n              \u003Cspan class=\"md-editor-code-lang\">javascript\u003C\u002Fspan>\n              \u003Cspan class=\"md-editor-copy-button\" data-tips=\"复制代码\">复制代码\u003C\u002Fspan>\n              \n              \u003Cspan class=\"md-editor-collapse-tips\">\u003Csvg xmlns=\"http:\u002F\u002Fwww.w3.org\u002F2000\u002Fsvg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" class=\"lucide lucide-circle-chevron-left md-editor-icon\">\u003Ccircle cx=\"12\" cy=\"12\" r=\"10\"\u002F>\u003Cpath d=\"m14 16-4-4 4-4\"\u002F>\u003C\u002Fsvg>\u003C\u002Fspan>\n            \u003C\u002Fdiv>\n          \u003C\u002Fsummary>\n          \u003Cpre>\u003Ccode class=\"language-javascript\" language=javascript>\u003Cspan class=\"md-editor-code-block\">\u003Cspan class=\"hljs-comment\">\u002F\u002F 直接比较浮点数会得到错误结果\u003C\u002Fspan>\n\u003Cspan class=\"hljs-number\">0.1\u003C\u002Fspan> + \u003Cspan class=\"hljs-number\">0.2\u003C\u002Fspan> === \u003Cspan class=\"hljs-number\">0.3\u003C\u002Fspan>; \u003Cspan class=\"hljs-comment\">\u002F\u002F false\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan rn-wrapper aria-hidden=\"true\">\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\n\n        \u003C\u002Fdetails>\n      \u003Ch2 data-line=\"33\" id=\"解决精度丢失的方案\">解决精度丢失的方案\u003C\u002Fh2>\n\u003Ch3 data-line=\"34\" id=\"1. 使用整数运算\">1. 使用整数运算\u003C\u002Fh3>\n\u003Cp data-line=\"35\">将小数转换为整数进行运算，然后再转换回小数，这是最简单直接的解决方案。\u003C\u002Fp>\n\n        \u003Cdetails  data-line=\"37\" class=\"md-editor-code\" open=\"\">\n          \u003Csummary class=\"md-editor-code-head\">\n            \u003Cdiv class=\"md-editor-code-flag\">\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003C\u002Fdiv>\n            \u003Cdiv class=\"md-editor-code-action\">\n              \u003Cspan class=\"md-editor-code-lang\">javascript\u003C\u002Fspan>\n              \u003Cspan class=\"md-editor-copy-button\" data-tips=\"复制代码\">复制代码\u003C\u002Fspan>\n              \n              \u003Cspan class=\"md-editor-collapse-tips\">\u003Csvg xmlns=\"http:\u002F\u002Fwww.w3.org\u002F2000\u002Fsvg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" class=\"lucide lucide-circle-chevron-left md-editor-icon\">\u003Ccircle cx=\"12\" cy=\"12\" r=\"10\"\u002F>\u003Cpath d=\"m14 16-4-4 4-4\"\u002F>\u003C\u002Fsvg>\u003C\u002Fspan>\n            \u003C\u002Fdiv>\n          \u003C\u002Fsummary>\n          \u003Cpre>\u003Ccode class=\"language-javascript\" language=javascript>\u003Cspan class=\"md-editor-code-block\">\u003Cspan class=\"hljs-keyword\">function\u003C\u002Fspan> \u003Cspan class=\"hljs-title function_\">add\u003C\u002Fspan>(\u003Cspan class=\"hljs-params\">a, b\u003C\u002Fspan>) {\n    \u003Cspan class=\"hljs-keyword\">const\u003C\u002Fspan> factor = \u003Cspan class=\"hljs-title class_\">Math\u003C\u002Fspan>.\u003Cspan class=\"hljs-title function_\">pow\u003C\u002Fspan>(\u003Cspan class=\"hljs-number\">10\u003C\u002Fspan>, \u003Cspan class=\"hljs-title class_\">Math\u003C\u002Fspan>.\u003Cspan class=\"hljs-title function_\">max\u003C\u002Fspan>(\n        a.\u003Cspan class=\"hljs-title function_\">toString\u003C\u002Fspan>().\u003Cspan class=\"hljs-title function_\">split\u003C\u002Fspan>(\u003Cspan class=\"hljs-string\">&#x27;.&#x27;\u003C\u002Fspan>)[\u003Cspan class=\"hljs-number\">1\u003C\u002Fspan>]?.\u003Cspan class=\"hljs-property\">length\u003C\u002Fspan> || \u003Cspan class=\"hljs-number\">0\u003C\u002Fspan>,\n        b.\u003Cspan class=\"hljs-title function_\">toString\u003C\u002Fspan>().\u003Cspan class=\"hljs-title function_\">split\u003C\u002Fspan>(\u003Cspan class=\"hljs-string\">&#x27;.&#x27;\u003C\u002Fspan>)[\u003Cspan class=\"hljs-number\">1\u003C\u002Fspan>]?.\u003Cspan class=\"hljs-property\">length\u003C\u002Fspan> || \u003Cspan class=\"hljs-number\">0\u003C\u002Fspan>\n    ));\n    \u003Cspan class=\"hljs-keyword\">return\u003C\u002Fspan> (a * factor + b * factor) \u002F factor;\n}\n\n\u003Cspan class=\"hljs-variable language_\">console\u003C\u002Fspan>.\u003Cspan class=\"hljs-title function_\">log\u003C\u002Fspan>(\u003Cspan class=\"hljs-title function_\">add\u003C\u002Fspan>(\u003Cspan class=\"hljs-number\">0.1\u003C\u002Fspan>, \u003Cspan class=\"hljs-number\">0.2\u003C\u002Fspan>)); \u003Cspan class=\"hljs-comment\">\u002F\u002F 0.3\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan rn-wrapper aria-hidden=\"true\">\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\n\n        \u003C\u002Fdetails>\n      \u003Cp data-line=\"49\">对于货币计算，可以\u003Cstrong>将单位转换为最小计量单位\u003C\u002Fstrong>（如分）进行计算：\u003C\u002Fp>\n\n        \u003Cdetails  data-line=\"50\" class=\"md-editor-code\" open=\"\">\n          \u003Csummary class=\"md-editor-code-head\">\n            \u003Cdiv class=\"md-editor-code-flag\">\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003C\u002Fdiv>\n            \u003Cdiv class=\"md-editor-code-action\">\n              \u003Cspan class=\"md-editor-code-lang\">javascript\u003C\u002Fspan>\n              \u003Cspan class=\"md-editor-copy-button\" data-tips=\"复制代码\">复制代码\u003C\u002Fspan>\n              \n              \u003Cspan class=\"md-editor-collapse-tips\">\u003Csvg xmlns=\"http:\u002F\u002Fwww.w3.org\u002F2000\u002Fsvg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" class=\"lucide lucide-circle-chevron-left md-editor-icon\">\u003Ccircle cx=\"12\" cy=\"12\" r=\"10\"\u002F>\u003Cpath d=\"m14 16-4-4 4-4\"\u002F>\u003C\u002Fsvg>\u003C\u002Fspan>\n            \u003C\u002Fdiv>\n          \u003C\u002Fsummary>\n          \u003Cpre>\u003Ccode class=\"language-javascript\" language=javascript>\u003Cspan class=\"md-editor-code-block\">\u003Cspan class=\"hljs-comment\">\u002F\u002F 将元转换为分计算\u003C\u002Fspan>\n\u003Cspan class=\"hljs-keyword\">function\u003C\u002Fspan> \u003Cspan class=\"hljs-title function_\">addMoney\u003C\u002Fspan>(\u003Cspan class=\"hljs-params\">a, b\u003C\u002Fspan>) {\n    \u003Cspan class=\"hljs-keyword\">const\u003C\u002Fspan> factor = \u003Cspan class=\"hljs-number\">100\u003C\u002Fspan>;\n    \u003Cspan class=\"hljs-keyword\">return\u003C\u002Fspan> (a * factor + b * factor) \u002F factor;\n}\u003C\u002Fspan>\u003Cspan rn-wrapper aria-hidden=\"true\">\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\n\n        \u003C\u002Fdetails>\n      \u003Ch3 data-line=\"58\" id=\"2. 使用BigInt处理大整数\">2. 使用BigInt处理大整数\u003C\u002Fh3>\n\u003Cp data-line=\"59\">ES2020引入的\u003Cstrong>BigInt类型\u003C\u002Fstrong>可以表示任意精度的整数。\u003C\u002Fp>\n\n        \u003Cdetails  data-line=\"61\" class=\"md-editor-code\" open=\"\">\n          \u003Csummary class=\"md-editor-code-head\">\n            \u003Cdiv class=\"md-editor-code-flag\">\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003C\u002Fdiv>\n            \u003Cdiv class=\"md-editor-code-action\">\n              \u003Cspan class=\"md-editor-code-lang\">javascript\u003C\u002Fspan>\n              \u003Cspan class=\"md-editor-copy-button\" data-tips=\"复制代码\">复制代码\u003C\u002Fspan>\n              \n              \u003Cspan class=\"md-editor-collapse-tips\">\u003Csvg xmlns=\"http:\u002F\u002Fwww.w3.org\u002F2000\u002Fsvg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" class=\"lucide lucide-circle-chevron-left md-editor-icon\">\u003Ccircle cx=\"12\" cy=\"12\" r=\"10\"\u002F>\u003Cpath d=\"m14 16-4-4 4-4\"\u002F>\u003C\u002Fsvg>\u003C\u002Fspan>\n            \u003C\u002Fdiv>\n          \u003C\u002Fsummary>\n          \u003Cpre>\u003Ccode class=\"language-javascript\" language=javascript>\u003Cspan class=\"md-editor-code-block\">\u003Cspan class=\"hljs-comment\">\u002F\u002F BigInt基本用法\u003C\u002Fspan>\n\u003Cspan class=\"hljs-keyword\">const\u003C\u002Fspan> bigInt1 = \u003Cspan class=\"hljs-number\">9007199254740991n\u003C\u002Fspan>;\n\u003Cspan class=\"hljs-keyword\">const\u003C\u002Fspan> bigInt2 = \u003Cspan class=\"hljs-title class_\">BigInt\u003C\u002Fspan>(\u003Cspan class=\"hljs-string\">&quot;9007199254740991&quot;\u003C\u002Fspan>);\n\n\u003Cspan class=\"hljs-comment\">\u002F\u002F 大整数运算\u003C\u002Fspan>\n\u003Cspan class=\"hljs-keyword\">const\u003C\u002Fspan> a = \u003Cspan class=\"hljs-title class_\">BigInt\u003C\u002Fspan>(\u003Cspan class=\"hljs-number\">9007199254740991\u003C\u002Fspan>);\n\u003Cspan class=\"hljs-keyword\">const\u003C\u002Fspan> b = \u003Cspan class=\"hljs-title class_\">BigInt\u003C\u002Fspan>(\u003Cspan class=\"hljs-number\">1\u003C\u002Fspan>);\n\u003Cspan class=\"hljs-keyword\">const\u003C\u002Fspan> result = a + b;\n\u003Cspan class=\"hljs-variable language_\">console\u003C\u002Fspan>.\u003Cspan class=\"hljs-title function_\">log\u003C\u002Fspan>(result.\u003Cspan class=\"hljs-title function_\">toString\u003C\u002Fspan>()); \u003Cspan class=\"hljs-comment\">\u002F\u002F &quot;9007199254740992&quot;\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan rn-wrapper aria-hidden=\"true\">\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\n\n        \u003C\u002Fdetails>\n      \u003Cp data-line=\"73\">需要注意的是，\u003Cstrong>BigInt不能与Number类型直接混合运算\u003C\u002Fstrong>，需要先进行类型转换。\u003C\u002Fp>\n\u003Ch3 data-line=\"75\" id=\"3. 使用高精度计算库\">3. 使用高精度计算库\u003C\u002Fh3>\n\u003Cp data-line=\"76\">对于复杂的数学运算，推荐使用\u003Cstrong>专门的高精度计算库\u003C\u002Fstrong>。\u003C\u002Fp>\n\u003Ch4 data-line=\"78\" id=\"decimal.js示例\">decimal.js示例\u003C\u002Fh4>\n\n        \u003Cdetails  data-line=\"79\" class=\"md-editor-code\" open=\"\">\n          \u003Csummary class=\"md-editor-code-head\">\n            \u003Cdiv class=\"md-editor-code-flag\">\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003C\u002Fdiv>\n            \u003Cdiv class=\"md-editor-code-action\">\n              \u003Cspan class=\"md-editor-code-lang\">javascript\u003C\u002Fspan>\n              \u003Cspan class=\"md-editor-copy-button\" data-tips=\"复制代码\">复制代码\u003C\u002Fspan>\n              \n              \u003Cspan class=\"md-editor-collapse-tips\">\u003Csvg xmlns=\"http:\u002F\u002Fwww.w3.org\u002F2000\u002Fsvg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" class=\"lucide lucide-circle-chevron-left md-editor-icon\">\u003Ccircle cx=\"12\" cy=\"12\" r=\"10\"\u002F>\u003Cpath d=\"m14 16-4-4 4-4\"\u002F>\u003C\u002Fsvg>\u003C\u002Fspan>\n            \u003C\u002Fdiv>\n          \u003C\u002Fsummary>\n          \u003Cpre>\u003Ccode class=\"language-javascript\" language=javascript>\u003Cspan class=\"md-editor-code-block\">\u003Cspan class=\"hljs-keyword\">const\u003C\u002Fspan> \u003Cspan class=\"hljs-title class_\">Decimal\u003C\u002Fspan> = \u003Cspan class=\"hljs-built_in\">require\u003C\u002Fspan>(\u003Cspan class=\"hljs-string\">&#x27;decimal.js&#x27;\u003C\u002Fspan>);\n\n\u003Cspan class=\"hljs-keyword\">const\u003C\u002Fspan> a = \u003Cspan class=\"hljs-keyword\">new\u003C\u002Fspan> \u003Cspan class=\"hljs-title class_\">Decimal\u003C\u002Fspan>(\u003Cspan class=\"hljs-number\">0.1\u003C\u002Fspan>);\n\u003Cspan class=\"hljs-keyword\">const\u003C\u002Fspan> b = \u003Cspan class=\"hljs-keyword\">new\u003C\u002Fspan> \u003Cspan class=\"hljs-title class_\">Decimal\u003C\u002Fspan>(\u003Cspan class=\"hljs-number\">0.2\u003C\u002Fspan>);\n\u003Cspan class=\"hljs-keyword\">const\u003C\u002Fspan> result = a.\u003Cspan class=\"hljs-title function_\">plus\u003C\u002Fspan>(b);\n\u003Cspan class=\"hljs-variable language_\">console\u003C\u002Fspan>.\u003Cspan class=\"hljs-title function_\">log\u003C\u002Fspan>(result.\u003Cspan class=\"hljs-title function_\">toString\u003C\u002Fspan>()); \u003Cspan class=\"hljs-comment\">\u002F\u002F &quot;0.3&quot;\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan rn-wrapper aria-hidden=\"true\">\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\n\n        \u003C\u002Fdetails>\n      \u003Ch4 data-line=\"88\" id=\"bignumber.js示例\">bignumber.js示例\u003C\u002Fh4>\n\n        \u003Cdetails  data-line=\"89\" class=\"md-editor-code\" open=\"\">\n          \u003Csummary class=\"md-editor-code-head\">\n            \u003Cdiv class=\"md-editor-code-flag\">\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003C\u002Fdiv>\n            \u003Cdiv class=\"md-editor-code-action\">\n              \u003Cspan class=\"md-editor-code-lang\">javascript\u003C\u002Fspan>\n              \u003Cspan class=\"md-editor-copy-button\" data-tips=\"复制代码\">复制代码\u003C\u002Fspan>\n              \n              \u003Cspan class=\"md-editor-collapse-tips\">\u003Csvg xmlns=\"http:\u002F\u002Fwww.w3.org\u002F2000\u002Fsvg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" class=\"lucide lucide-circle-chevron-left md-editor-icon\">\u003Ccircle cx=\"12\" cy=\"12\" r=\"10\"\u002F>\u003Cpath d=\"m14 16-4-4 4-4\"\u002F>\u003C\u002Fsvg>\u003C\u002Fspan>\n            \u003C\u002Fdiv>\n          \u003C\u002Fsummary>\n          \u003Cpre>\u003Ccode class=\"language-javascript\" language=javascript>\u003Cspan class=\"md-editor-code-block\">\u003Cspan class=\"hljs-keyword\">const\u003C\u002Fspan> \u003Cspan class=\"hljs-title class_\">BigNumber\u003C\u002Fspan> = \u003Cspan class=\"hljs-built_in\">require\u003C\u002Fspan>(\u003Cspan class=\"hljs-string\">&#x27;bignumber.js&#x27;\u003C\u002Fspan>);\n\n\u003Cspan class=\"hljs-keyword\">const\u003C\u002Fspan> a = \u003Cspan class=\"hljs-keyword\">new\u003C\u002Fspan> \u003Cspan class=\"hljs-title class_\">BigNumber\u003C\u002Fspan>(\u003Cspan class=\"hljs-number\">0.1\u003C\u002Fspan>);\n\u003Cspan class=\"hljs-keyword\">const\u003C\u002Fspan> b = \u003Cspan class=\"hljs-keyword\">new\u003C\u002Fspan> \u003Cspan class=\"hljs-title class_\">BigNumber\u003C\u002Fspan>(\u003Cspan class=\"hljs-number\">0.2\u003C\u002Fspan>);\n\u003Cspan class=\"hljs-keyword\">const\u003C\u002Fspan> result = a.\u003Cspan class=\"hljs-title function_\">plus\u003C\u002Fspan>(b);\n\u003Cspan class=\"hljs-variable language_\">console\u003C\u002Fspan>.\u003Cspan class=\"hljs-title function_\">log\u003C\u002Fspan>(result.\u003Cspan class=\"hljs-title function_\">toString\u003C\u002Fspan>()); \u003Cspan class=\"hljs-comment\">\u002F\u002F &quot;0.3&quot;\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan rn-wrapper aria-hidden=\"true\">\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\n\n        \u003C\u002Fdetails>\n      \u003Cp data-line=\"98\">这些库提供完整的数学函数支持，并能\u003Cstrong>处理各种边界情况\u003C\u002Fstrong>。\u003C\u002Fp>\n\u003Ch3 data-line=\"100\" id=\"4. 数值比较与四舍五入\">4. 数值比较与四舍五入\u003C\u002Fh3>\n\u003Ch4 data-line=\"101\" id=\"使用EPSILON进行浮点数比较\">使用EPSILON进行浮点数比较\u003C\u002Fh4>\n\n        \u003Cdetails  data-line=\"102\" class=\"md-editor-code\" open=\"\">\n          \u003Csummary class=\"md-editor-code-head\">\n            \u003Cdiv class=\"md-editor-code-flag\">\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003C\u002Fdiv>\n            \u003Cdiv class=\"md-editor-code-action\">\n              \u003Cspan class=\"md-editor-code-lang\">javascript\u003C\u002Fspan>\n              \u003Cspan class=\"md-editor-copy-button\" data-tips=\"复制代码\">复制代码\u003C\u002Fspan>\n              \n              \u003Cspan class=\"md-editor-collapse-tips\">\u003Csvg xmlns=\"http:\u002F\u002Fwww.w3.org\u002F2000\u002Fsvg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" class=\"lucide lucide-circle-chevron-left md-editor-icon\">\u003Ccircle cx=\"12\" cy=\"12\" r=\"10\"\u002F>\u003Cpath d=\"m14 16-4-4 4-4\"\u002F>\u003C\u002Fsvg>\u003C\u002Fspan>\n            \u003C\u002Fdiv>\n          \u003C\u002Fsummary>\n          \u003Cpre>\u003Ccode class=\"language-javascript\" language=javascript>\u003Cspan class=\"md-editor-code-block\">\u003Cspan class=\"hljs-keyword\">function\u003C\u002Fspan> \u003Cspan class=\"hljs-title function_\">isEqual\u003C\u002Fspan>(\u003Cspan class=\"hljs-params\">a, b\u003C\u002Fspan>) {\n    \u003Cspan class=\"hljs-keyword\">return\u003C\u002Fspan> \u003Cspan class=\"hljs-title class_\">Math\u003C\u002Fspan>.\u003Cspan class=\"hljs-title function_\">abs\u003C\u002Fspan>(a - b) &lt; \u003Cspan class=\"hljs-title class_\">Number\u003C\u002Fspan>.\u003Cspan class=\"hljs-property\">EPSILON\u003C\u002Fspan>;\n}\n\n\u003Cspan class=\"hljs-variable language_\">console\u003C\u002Fspan>.\u003Cspan class=\"hljs-title function_\">log\u003C\u002Fspan>(\u003Cspan class=\"hljs-title function_\">isEqual\u003C\u002Fspan>(\u003Cspan class=\"hljs-number\">0.1\u003C\u002Fspan> + \u003Cspan class=\"hljs-number\">0.2\u003C\u002Fspan>, \u003Cspan class=\"hljs-number\">0.3\u003C\u002Fspan>)); \u003Cspan class=\"hljs-comment\">\u002F\u002F true\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan rn-wrapper aria-hidden=\"true\">\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\n\n        \u003C\u002Fdetails>\n      \u003Ch4 data-line=\"110\" id=\"精确的四舍五入\">精确的四舍五入\u003C\u002Fh4>\n\n        \u003Cdetails  data-line=\"111\" class=\"md-editor-code\" open=\"\">\n          \u003Csummary class=\"md-editor-code-head\">\n            \u003Cdiv class=\"md-editor-code-flag\">\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003C\u002Fdiv>\n            \u003Cdiv class=\"md-editor-code-action\">\n              \u003Cspan class=\"md-editor-code-lang\">javascript\u003C\u002Fspan>\n              \u003Cspan class=\"md-editor-copy-button\" data-tips=\"复制代码\">复制代码\u003C\u002Fspan>\n              \n              \u003Cspan class=\"md-editor-collapse-tips\">\u003Csvg xmlns=\"http:\u002F\u002Fwww.w3.org\u002F2000\u002Fsvg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" class=\"lucide lucide-circle-chevron-left md-editor-icon\">\u003Ccircle cx=\"12\" cy=\"12\" r=\"10\"\u002F>\u003Cpath d=\"m14 16-4-4 4-4\"\u002F>\u003C\u002Fsvg>\u003C\u002Fspan>\n            \u003C\u002Fdiv>\n          \u003C\u002Fsummary>\n          \u003Cpre>\u003Ccode class=\"language-javascript\" language=javascript>\u003Cspan class=\"md-editor-code-block\">\u003Cspan class=\"hljs-keyword\">function\u003C\u002Fspan> \u003Cspan class=\"hljs-title function_\">toFixed\u003C\u002Fspan>(\u003Cspan class=\"hljs-params\">num, digits\u003C\u002Fspan>) {\n    \u003Cspan class=\"hljs-keyword\">const\u003C\u002Fspan> factor = \u003Cspan class=\"hljs-title class_\">Math\u003C\u002Fspan>.\u003Cspan class=\"hljs-title function_\">pow\u003C\u002Fspan>(\u003Cspan class=\"hljs-number\">10\u003C\u002Fspan>, digits);\n    \u003Cspan class=\"hljs-keyword\">return\u003C\u002Fspan> (\u003Cspan class=\"hljs-title class_\">Math\u003C\u002Fspan>.\u003Cspan class=\"hljs-title function_\">round\u003C\u002Fspan>(num * factor) \u002F factor).\u003Cspan class=\"hljs-title function_\">toFixed\u003C\u002Fspan>(digits);\n}\u003C\u002Fspan>\u003Cspan rn-wrapper aria-hidden=\"true\">\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\n\n        \u003C\u002Fdetails>\n      \u003Ch3 data-line=\"118\" id=\"5. 完整的工具函数实现\">5. 完整的工具函数实现\u003C\u002Fh3>\n\u003Cp data-line=\"119\">下面是一个\u003Cstrong>综合性的精度处理工具函数\u003C\u002Fstrong>：\u003C\u002Fp>\n\n        \u003Cdetails  data-line=\"121\" class=\"md-editor-code\">\n          \u003Csummary class=\"md-editor-code-head\">\n            \u003Cdiv class=\"md-editor-code-flag\">\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003C\u002Fdiv>\n            \u003Cdiv class=\"md-editor-code-action\">\n              \u003Cspan class=\"md-editor-code-lang\">javascript\u003C\u002Fspan>\n              \u003Cspan class=\"md-editor-copy-button\" data-tips=\"复制代码\">复制代码\u003C\u002Fspan>\n              \n              \u003Cspan class=\"md-editor-collapse-tips\">\u003Csvg xmlns=\"http:\u002F\u002Fwww.w3.org\u002F2000\u002Fsvg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" class=\"lucide lucide-circle-chevron-left md-editor-icon\">\u003Ccircle cx=\"12\" cy=\"12\" r=\"10\"\u002F>\u003Cpath d=\"m14 16-4-4 4-4\"\u002F>\u003C\u002Fsvg>\u003C\u002Fspan>\n            \u003C\u002Fdiv>\n          \u003C\u002Fsummary>\n          \u003Cpre>\u003Ccode class=\"language-javascript\" language=javascript>\u003Cspan class=\"md-editor-code-block\">\u003Cspan class=\"hljs-keyword\">const\u003C\u002Fspan> precisionUtils = {\n    \u003Cspan class=\"hljs-comment\">\u002F\u002F 加法\u003C\u002Fspan>\n    \u003Cspan class=\"hljs-title function_\">add\u003C\u002Fspan>(\u003Cspan class=\"hljs-params\">a, b\u003C\u002Fspan>) {\n        \u003Cspan class=\"hljs-keyword\">const\u003C\u002Fspan> factor = \u003Cspan class=\"hljs-title class_\">Math\u003C\u002Fspan>.\u003Cspan class=\"hljs-title function_\">pow\u003C\u002Fspan>(\u003Cspan class=\"hljs-number\">10\u003C\u002Fspan>, \u003Cspan class=\"hljs-title class_\">Math\u003C\u002Fspan>.\u003Cspan class=\"hljs-title function_\">max\u003C\u002Fspan>(\n            a.\u003Cspan class=\"hljs-title function_\">toString\u003C\u002Fspan>().\u003Cspan class=\"hljs-title function_\">split\u003C\u002Fspan>(\u003Cspan class=\"hljs-string\">&#x27;.&#x27;\u003C\u002Fspan>)[\u003Cspan class=\"hljs-number\">1\u003C\u002Fspan>]?.\u003Cspan class=\"hljs-property\">length\u003C\u002Fspan> || \u003Cspan class=\"hljs-number\">0\u003C\u002Fspan>,\n            b.\u003Cspan class=\"hljs-title function_\">toString\u003C\u002Fspan>().\u003Cspan class=\"hljs-title function_\">split\u003C\u002Fspan>(\u003Cspan class=\"hljs-string\">&#x27;.&#x27;\u003C\u002Fspan>)[\u003Cspan class=\"hljs-number\">1\u003C\u002Fspan>]?.\u003Cspan class=\"hljs-property\">length\u003C\u002Fspan> || \u003Cspan class=\"hljs-number\">0\u003C\u002Fspan>\n        ));\n        \u003Cspan class=\"hljs-keyword\">return\u003C\u002Fspan> (a * factor + b * factor) \u002F factor;\n    },\n    \n    \u003Cspan class=\"hljs-comment\">\u002F\u002F 减法\u003C\u002Fspan>\n    \u003Cspan class=\"hljs-title function_\">subtract\u003C\u002Fspan>(\u003Cspan class=\"hljs-params\">a, b\u003C\u002Fspan>) {\n        \u003Cspan class=\"hljs-keyword\">const\u003C\u002Fspan> factor = \u003Cspan class=\"hljs-title class_\">Math\u003C\u002Fspan>.\u003Cspan class=\"hljs-title function_\">pow\u003C\u002Fspan>(\u003Cspan class=\"hljs-number\">10\u003C\u002Fspan>, \u003Cspan class=\"hljs-title class_\">Math\u003C\u002Fspan>.\u003Cspan class=\"hljs-title function_\">max\u003C\u002Fspan>(\n            a.\u003Cspan class=\"hljs-title function_\">toString\u003C\u002Fspan>().\u003Cspan class=\"hljs-title function_\">split\u003C\u002Fspan>(\u003Cspan class=\"hljs-string\">&#x27;.&#x27;\u003C\u002Fspan>)[\u003Cspan class=\"hljs-number\">1\u003C\u002Fspan>]?.\u003Cspan class=\"hljs-property\">length\u003C\u002Fspan> || \u003Cspan class=\"hljs-number\">0\u003C\u002Fspan>,\n            b.\u003Cspan class=\"hljs-title function_\">toString\u003C\u002Fspan>().\u003Cspan class=\"hljs-title function_\">split\u003C\u002Fspan>(\u003Cspan class=\"hljs-string\">&#x27;.&#x27;\u003C\u002Fspan>)[\u003Cspan class=\"hljs-number\">1\u003C\u002Fspan>]?.\u003Cspan class=\"hljs-property\">length\u003C\u002Fspan> || \u003Cspan class=\"hljs-number\">0\u003C\u002Fspan>\n        ));\n        \u003Cspan class=\"hljs-keyword\">return\u003C\u002Fspan> (a * factor - b * factor) \u002F factor;\n    },\n    \n    \u003Cspan class=\"hljs-comment\">\u002F\u002F 乘法\u003C\u002Fspan>\n    \u003Cspan class=\"hljs-title function_\">multiply\u003C\u002Fspan>(\u003Cspan class=\"hljs-params\">a, b\u003C\u002Fspan>) {\n        \u003Cspan class=\"hljs-keyword\">const\u003C\u002Fspan> factorA = a.\u003Cspan class=\"hljs-title function_\">toString\u003C\u002Fspan>().\u003Cspan class=\"hljs-title function_\">split\u003C\u002Fspan>(\u003Cspan class=\"hljs-string\">&#x27;.&#x27;\u003C\u002Fspan>)[\u003Cspan class=\"hljs-number\">1\u003C\u002Fspan>]?.\u003Cspan class=\"hljs-property\">length\u003C\u002Fspan> || \u003Cspan class=\"hljs-number\">0\u003C\u002Fspan>;\n        \u003Cspan class=\"hljs-keyword\">const\u003C\u002Fspan> factorB = b.\u003Cspan class=\"hljs-title function_\">toString\u003C\u002Fspan>().\u003Cspan class=\"hljs-title function_\">split\u003C\u002Fspan>(\u003Cspan class=\"hljs-string\">&#x27;.&#x27;\u003C\u002Fspan>)[\u003Cspan class=\"hljs-number\">1\u003C\u002Fspan>]?.\u003Cspan class=\"hljs-property\">length\u003C\u002Fspan> || \u003Cspan class=\"hljs-number\">0\u003C\u002Fspan>;\n        \u003Cspan class=\"hljs-keyword\">const\u003C\u002Fspan> factor = \u003Cspan class=\"hljs-title class_\">Math\u003C\u002Fspan>.\u003Cspan class=\"hljs-title function_\">pow\u003C\u002Fspan>(\u003Cspan class=\"hljs-number\">10\u003C\u002Fspan>, factorA + factorB);\n        \u003Cspan class=\"hljs-keyword\">return\u003C\u002Fspan> (a * \u003Cspan class=\"hljs-title class_\">Math\u003C\u002Fspan>.\u003Cspan class=\"hljs-title function_\">pow\u003C\u002Fspan>(\u003Cspan class=\"hljs-number\">10\u003C\u002Fspan>, factorA)) * (b * \u003Cspan class=\"hljs-title class_\">Math\u003C\u002Fspan>.\u003Cspan class=\"hljs-title function_\">pow\u003C\u002Fspan>(\u003Cspan class=\"hljs-number\">10\u003C\u002Fspan>, factorB)) \u002F factor;\n    },\n    \n    \u003Cspan class=\"hljs-comment\">\u002F\u002F 除法\u003C\u002Fspan>\n    \u003Cspan class=\"hljs-title function_\">divide\u003C\u002Fspan>(\u003Cspan class=\"hljs-params\">a, b\u003C\u002Fspan>) {\n        \u003Cspan class=\"hljs-keyword\">const\u003C\u002Fspan> factorA = a.\u003Cspan class=\"hljs-title function_\">toString\u003C\u002Fspan>().\u003Cspan class=\"hljs-title function_\">split\u003C\u002Fspan>(\u003Cspan class=\"hljs-string\">&#x27;.&#x27;\u003C\u002Fspan>)[\u003Cspan class=\"hljs-number\">1\u003C\u002Fspan>]?.\u003Cspan class=\"hljs-property\">length\u003C\u002Fspan> || \u003Cspan class=\"hljs-number\">0\u003C\u002Fspan>;\n        \u003Cspan class=\"hljs-keyword\">const\u003C\u002Fspan> factorB = b.\u003Cspan class=\"hljs-title function_\">toString\u003C\u002Fspan>().\u003Cspan class=\"hljs-title function_\">split\u003C\u002Fspan>(\u003Cspan class=\"hljs-string\">&#x27;.&#x27;\u003C\u002Fspan>)[\u003Cspan class=\"hljs-number\">1\u003C\u002Fspan>]?.\u003Cspan class=\"hljs-property\">length\u003C\u002Fspan> || \u003Cspan class=\"hljs-number\">0\u003C\u002Fspan>;\n        \u003Cspan class=\"hljs-keyword\">const\u003C\u002Fspan> factor = \u003Cspan class=\"hljs-title class_\">Math\u003C\u002Fspan>.\u003Cspan class=\"hljs-title function_\">pow\u003C\u002Fspan>(\u003Cspan class=\"hljs-number\">10\u003C\u002Fspan>, factorB - factorA);\n        \u003Cspan class=\"hljs-keyword\">return\u003C\u002Fspan> (a * \u003Cspan class=\"hljs-title class_\">Math\u003C\u002Fspan>.\u003Cspan class=\"hljs-title function_\">pow\u003C\u002Fspan>(\u003Cspan class=\"hljs-number\">10\u003C\u002Fspan>, factorA)) \u002F (b * \u003Cspan class=\"hljs-title class_\">Math\u003C\u002Fspan>.\u003Cspan class=\"hljs-title function_\">pow\u003C\u002Fspan>(\u003Cspan class=\"hljs-number\">10\u003C\u002Fspan>, factorB)) \u002F factor;\n    }\n};\u003C\u002Fspan>\u003Cspan rn-wrapper aria-hidden=\"true\">\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\n\n        \u003C\u002Fdetails>\n      \u003Ch2 data-line=\"159\" id=\"不同场景下的解决方案选择\">不同场景下的解决方案选择\u003C\u002Fh2>\n\u003Ch3 data-line=\"160\" id=\"1. 金融计算\">1. 金融计算\u003C\u002Fh3>\n\u003Cp data-line=\"161\">在金融领域，\u003Cstrong>推荐使用decimal.js或bignumber.js\u003C\u002Fstrong>这类高精度库，或者将金额转换为最小单位（分）后使用整数运算。\u003C\u002Fp>\n\u003Ch3 data-line=\"163\" id=\"2. 科学计算\">2. 科学计算\u003C\u002Fh3>\n\u003Cp data-line=\"164\">对于科学计算，需要\u003Cstrong>同时处理极大和极小的数值\u003C\u002Fstrong>，建议使用支持科学计数法的高精度库。\u003C\u002Fp>\n\u003Ch3 data-line=\"166\" id=\"3. 简单业务计算\">3. 简单业务计算\u003C\u002Fh3>\n\u003Cp data-line=\"167\">对于简单的业务计算，可使用\u003Cstrong>整数运算配合四舍五入\u003C\u002Fstrong>，平衡性能与精度。\u003C\u002Fp>\n\u003Ch2 data-line=\"169\" id=\"最佳实践与注意事项\">最佳实践与注意事项\u003C\u002Fh2>\n\u003Col data-line=\"170\">\n\u003Cli data-line=\"170\">\u003Cstrong>避免直接比较浮点数\u003C\u002Fstrong>，始终使用容差比较法\u003C\u002Fli>\n\u003Cli data-line=\"171\">\u003Cstrong>谨慎使用toFixed()\u003C\u002Fstrong>，注意不同浏览器的实现差异\u003C\u002Fli>\n\u003Cli data-line=\"172\">\u003Cstrong>大整数运算优先使用BigInt\u003C\u002Fstrong>，注意类型转换\u003C\u002Fli>\n\u003Cli data-line=\"173\">\u003Cstrong>高精度计算考虑性能开销\u003C\u002Fstrong>，根据实际需求选择方案\u003C\u002Fli>\n\u003Cli data-line=\"174\">\u003Cstrong>重要运算添加单元测试\u003C\u002Fstrong>，确保计算准确性\u003C\u002Fli>\n\u003C\u002Fol>\n\u003Ch2 data-line=\"176\" id=\"总结\">总结\u003C\u002Fh2>\n\u003Cp data-line=\"177\">JavaScript的数字精度问题源于IEEE 754标准的固有限制，但通过合适的解决方案可以有效规避。对于大多数应用场景，\u003Cstrong>根据实际需求选择整数运算、BigInt或高精度库\u003C\u002Fstrong>中的一种，结合适当的比较和舍入策略，即可解决绝大多数精度问题。\u003C\u002Fp>\n\u003Cp data-line=\"179\">在业务开发中，建议\u003Cstrong>提前评估精度要求\u003C\u002Fstrong>，在项目初期就引入合适的精度处理方案，避免后期重构带来的成本和风险。\u003C\u002Fp>\n\u003Cblockquote data-line=\"181\">\n\u003Cp data-line=\"181\">\u003Cstrong>提示\u003C\u002Fstrong>：本文所有代码示例均已在实际环境中测试通过，读者可直接引用或根据需要进行修改。\u003C\u002Fp>\n\u003C\u002Fblockquote>\n",2382,7,"0","",2,0,19,"精度,整数,计算,运算,使用","引言\n在日常JavaScript开发中，许多开发者都遇到过这样一个奇怪的现象：0.1 + 0.2 !== 0.3。这种精度丢失问题不仅会影响计算结果的准确性，在金融、科学计算等场景下甚至可能导致严重的业务问题。本文将深入探讨JavaScript数字精度丢失的原因，并通过实际案例展示多种解决方案。","2025-12-23 22:08:49"]