切换导航
简历
工具
演示
查询
导航菜单
服务端
30
前端
114
数据库
82
进阶开发
8
桌面程序
2
QA
15
软件使用
36
规范协议
5
操作系统
11
AI
0
复用资源
6
硬件
0
标签
HTML
正则表达式
Json
包管理工具
vite
CSS
XPath
JavaScript
Jquery
less
ES6
Vue
React
vue 3
Layui
editor.md
sea.js
Zepto.js
mysql.js
mssql.js
NodeJs
Express
前端template
YAML
杂项
外部链接
.NET Core SDK和运行时安装包
淘宝 NPM 镜像
查询网
Tables Generator线上表格转换工具
引用cdn在线脚本和样式
首页
前端
JS 小数精度介绍与问题
[TOC] 在 JavaScript 中,浮点数精度问题是 IEEE 754 双精度浮点数标准的固有特性,不是 bug,而是这种表示方法的局限性。 ## 为什么会出现这种情况? 计算机使用二进制表示小数,而很多十进制小数(如 0.1、0.2)在二进制中是无限循环小数,就像 1/3 在十进制中是 0.333... 一样。 ### 二进制表示问题: - 0.08(十进制)在二进制中是循环小数 - 0.25(十进制)在二进制中是精确的 0.01 - 两个近似值的减法会放大误差 ## 解决方法 ### 1. **四舍五入法(最常用)** ```javascript const result = 0.08 - 0.25; const fixedResult = Math.round(result * 100) / 100; // -0.17 // 或 const fixedResult2 = Number(result.toFixed(2)); // -0.17 ``` ### 2. **转换为整数计算** ```javascript function safeSubtract(a, b) { const factor = Math.pow(10, Math.max( a.toString().split('.')[1]?.length || 0, b.toString().split('.')[1]?.length || 0 )); return (a * factor - b * factor) / factor; } const result = safeSubtract(0.08, 0.25); // -0.17 ``` ### 3. **使用第三方库** ```javascript // 使用 decimal.js import { Decimal } from 'decimal.js'; const result = new Decimal(0.08).minus(0.25).toNumber(); // -0.17 // 使用 bignumber.js import BigNumber from 'bignumber.js'; const result = new BigNumber(0.08).minus(0.25).toNumber(); // -0.17 ``` ### 4. **EPSILON 误差范围比较** ```javascript function areNumbersEqual(a, b, epsilon = Number.EPSILON) { return Math.abs(a - b) < epsilon; } const result = 0.08 - 0.25; console.log(areNumbersEqual(result, -0.17)); // true ``` ### 5. **通用精度处理函数** ```javascript function formatFloat(num, precision = 12) { return parseFloat(num.toPrecision(precision)); } const result = formatFloat(0.08 - 0.25); // -0.17 ``` ### 6. **实际应用建议** ```javascript // 对于金融计算,始终使用整数(以分为单位) function calculateMoney(aYuan, bYuan) { const aFen = Math.round(aYuan * 100); const bFen = Math.round(bYuan * 100); return (aFen - bFen) / 100; } const result = calculateMoney(0.08, 0.25); // -0.17 ``` ## 最佳实践 1. **显示时格式化**:存储时使用浮点数,显示时格式化 ```javascript function formatCurrency(value) { return value.toLocaleString('zh-CN', { minimumFractionDigits: 2, maximumFractionDigits: 2 }); } console.log(formatCurrency(0.08 - 0.25)); // "-0.17" ``` 2. **比较时使用容差** ```javascript function compareFloats(a, b, tolerance = 0.000001) { return Math.abs(a - b) < tolerance; } ``` 3. **关键计算使用库** ```javascript // 对于财务系统 // 推荐使用:decimal.js, big.js, bignumber.js ``` ## 注意事项 - `toFixed()` 返回的是字符串,可能需要转换回数字 - 对于大量计算,整数方法性能更好 - 根据业务需求选择合适的精度(一般 2-4 位小数足够) 浮点数精度问题是所有使用 IEEE 754 标准的语言都会遇到的问题,理解其原理并选择合适的处理方法非常重要。
扫一扫手机看
点击排行
windows 文件资源管理器使用
Layui 弹窗open使用说明
SQL Server 中字符串函数使用
C# 使用QQ邮箱代理做邮件接收功能
SQL Server关于apply的两种形式cross apply 和 outer apply
ASP.NET MVC 模型的自定义验证
nvm安装及常用命令
SQL Server 中数据类型转换
SQL Server 中WITH AS短语的使用
IE浏览器下AJAX缓存问题导致数据不更新的解决办法
订阅号