JS - 浮点数不精确的解决方案
2021-08-31 19:17
966 查看
前言
js浮点数的计算存在精度不准的问题,解决方案:用整数与整数的加减乘除运算来规避该问题。
JS - 浮点数计算不精确
let [num1,num2] = [0.1, 0.2]; console.log(num1 + num2); // 0.30000000000000004 console.log(num1 - num2); // -0.1 console.log(num1 * num2); // 0.020000000000000004 console.log(num1 / num2); // 0.5
解决方案
number.js
/** * 加 + * @param num1 * @param num2 * @returns {number} */ function accAddition(num1, num2) { const num1Digits = (num1.toString().split('.')[1] || '').length; const num2Digits = (num2.toString().split('.')[1] || '').length; const baseNum = Math.pow(10, Math.max(num1Digits, num2Digits)); return (Math.round(num1 * baseNum) + Math.round(num2 * baseNum)) / baseNum; } /** * 减 - * @param num1 * @param num2 * @returns {number} */ function accSubtract(num1, num2) { const num1Digits = (num1.toString().split('.')[1] || '').length; const num2Digits = (num2.toString().split('.')[1] || '').length; const baseNum = Math.pow(10, Math.max(num1Digits, num2Digits)); return (Math.round(num1 * baseNum) - Math.round(num2 * baseNum)) / baseNum; } /** * 乘 * * @param num1 * @param num2 * @returns {number} */ function accMultiply(num1, num2) { const num1Digits = (num1.toString().split('.')[1] || '').length; const num2Digits = (num2.toString().split('.')[1] || '').length; const baseNum = Math.pow(10, Math.max(num1Digits, num2Digits)); return (Math.round(num1 * baseNum) * Math.round(num2 * baseNum)) / baseNum / baseNum; } /** * 除 / * @param num1 * @param num2 * @returns {number} */ function accDivision(num1, num2) { const num1Digits = (num1.toString().split('.')[1] || '').length; const num2Digits = (num2.toString().split('.')[1] || '').length; const baseNum = Math.pow(10, Math.max(num1Digits, num2Digits)); return (Math.round(num1 * baseNum) / Math.round(num2 * baseNum)); } export { accAddition, accMultiply, accSubtract, accDivision }
结果验证
import {accAddition, accSubtract, accMultiply, accDivision} from "@/utils/number"; let [num1,num2] = [0.1, 0.2]; console.log(accAddition(num1, num2)); // 0.3 console.log(accSubtract(num1, num2)); // -0.1 console.log(accMultiply(num1, num2)); // 0.02 console.log(accDivision(num1, num2)); // 0.5
相关文章推荐
- JS浮点数运算结果不精确的Bug解决
- js精确浮点运算(转)
- JS 浮点数运算丢失精度解决方案
- 实现js浮点数加、减、乘、除的精确计算(网上很多文章里的方法是不能解决所有js浮点数计算误差的)
- JS 浮点数运算丢失精度解决方案
- [导入]js 浮点运算表达式 精确计算(vb没有这个问题)
- js浮点数精确计算(加、减、乘、除)
- JAVA 及 js 浮点数精确计算
- 实现js浮点数加、减、乘、除的精确计算(网上很多文章里的方法是不能解决所有js浮点数计算误差的)
- js浮点数精确计算(加、减、乘、除)
- 转(JS中浮点运算精度错误BUG解决方案)
- JAVA 及 js 浮点数精确计算
- JS 浮点数的 精确运算
- JS 浮点值精确计算
- js浮点数精确计算函数(加,…
- js parseFloat 浮点数求和 精确位数
- JS计算浮点数加减乘除精确数值的方法
- python 浮点数精确运算解决方案
- js浮点数精确计算(加、减、乘、除)
- js浮点数相加、减、乘、除精确计算