簡介
Decimal.js 是一個用于 JavaScript 的精確數(shù)學(xué)運(yùn)算庫,主要解決 JavaScript 原生浮點(diǎn)數(shù)運(yùn)算的精度問題。
這里封裝一個通用方法便于各個前端項目使用。
當(dāng)前所用版本:"decimal.js": "^10.6.0"
代碼
import Decimal from 'decimal.js';
export const tools = {
// 當(dāng)前是是否為空值
isNUll(val: any) {
return val === null || val === void 0 || val === '' || val.toString() === 'NaN';
},
/**
* 數(shù)值保留小數(shù)處理
* @param value 數(shù)值
* @param decimals 小數(shù)位數(shù)
* @param mode 處理方式 ceil:向上取整 floor:向下取整 round:四舍五入 【有精度時是先放大 - 再取整或者四舍五入 - 再縮小】
* @returns
*/
roundTo(value: number | string, decimals: number, mode: 'round' | 'ceil' | 'floor' = 'round') {
if (tools.isNUll(value)) return '';
try {
const decimalValue = new Decimal(value.toString());
const factor = new Decimal(10).pow(decimals || 0);
let result: Decimal;
if (mode === 'ceil') {
result = decimalValue.mul(factor).ceil().div(factor);
} else if (mode === 'floor') {
result = decimalValue.mul(factor).floor().div(factor);
} else {
result = decimalValue.mul(factor).round().div(factor);
}
if (tools.isNUll(decimals)) {
return result.toString();
}
// 格式化為字符串,避免科學(xué)計數(shù)法
return result.toFixed(decimals);
} catch (e) {
console.warn('數(shù)值保留小數(shù)處理錯誤:', value, decimals, mode, e);
return '';
}
},
}