网站首页 > 技术文章 正文
在开发中经常遇见浮点数计算,但因为计算机在计算浮点数时都会因为精度问题造成计算的数值出现误差(精度丢失并不是js语言独有的,只有是采用IEEE 754 标准来表示浮点数的语言都会出现精度误差),所以今天写了一个计算工具函数来处理下
因精度丢失而产生的问题,如图所示
工具函数,支持加减乘除
/**
* 浮点数计算
* 支持 +-/*
* 支持多位计算
* @argument args 浮点数组
* @argument operator 操作符,默认+
*
*/
function computeFloatNumber(args,operator='+') {
if(arguments.length===0) return
if(!Array.isArray(args)) {
throw new Error('The argument should be an array!')
}
if(args.length<=1) return args[0]
// 获取浮点数组里最大的精度
const precision = Math.max(...args.map(d=>getDecimalLength(d)));
// 数字的幂的内置函数 Math.pow(10, 2)=> 100
const multiplier = Math.pow(10, precision);
// 浮点数组转为整数数组
const nums = args.map(d=>Math.round(d*multiplier))
let result=0
switch (operator) {
// 使用reduce可以实现多位累计计算
case '+':
result = nums.reduce((p,n)=>p+n);
break
case '-':
result = nums.reduce((p,n)=>p-n);
break
case '*':
result = nums.reduce((p,n)=>p*n);
break
case '/':
result = nums.reduce((p,n)=>p/n);
break
default:
return 'Invalid operator';
}
if(operator==='/') return result
if(operator==='*') {
let _mul = Math.pow(10, precision*nums.length);
console.log('_mul',nums,_mul,result)
return result/_mul
}
return result/multiplier
}
// 获取浮点数精度位数
function getDecimalLength(num) {
const [, decimal] = String(num).split('.');
return decimal ? decimal.length : 0;
}
ps:
- 整数之间计算是不会产生精度问题的,在遇见浮点计算时,最好是将浮点数转为整数
猜你喜欢
- 2024-11-09 极客算法训练笔记(十),十大经典排序之计数排序、基数排序
- 2024-11-09 Axure RP 9 学习笔记 - 常用数学函数
- 2024-11-09 判断坐标点是否在高德地图围栏内的算法?
- 2024-11-09 Quick Pow: 如何快速求幂 快速幂算法
- 2024-11-09 十六、Java运算符-优先级与表达式
- 2024-11-09 抖音B站…推荐机制的原型,威尔逊得分排序算法
- 2024-11-09 浅谈移动设备交互体验之惯性滚动 惯性移轴定理
- 2024-11-09 JS中常见的Math对象 javascript中math
- 2024-11-09 力扣73——矩阵置零 矩阵置0
- 2024-11-09 基数排序的1个小技巧,2种排序方式,3种排序算法
- 标签列表
-
- content-disposition (47)
- nth-child (56)
- math.pow (44)
- 原型和原型链 (63)
- canvas mdn (36)
- css @media (49)
- promise mdn (39)
- readasdataurl (52)
- if-modified-since (49)
- css ::after (50)
- border-image-slice (40)
- flex mdn (37)
- .join (41)
- function.apply (60)
- input type number (64)
- weakmap (62)
- js arguments (45)
- js delete方法 (61)
- blob type (44)
- math.max.apply (51)
- js (44)
- firefox 3 (47)
- cssbox-sizing (52)
- js删除 (49)
- js for continue (56)
- 最新留言
-