@ryanuo/utils
Version:
提供多种实用工具函数,涵盖算法、浏览器操作、网络请求等多个领域
104 lines (103 loc) • 2.98 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.CalculatorChain = void 0;
exports.calculatePercentage = calculatePercentage;
exports.compare = compare;
exports.decimal = void 0;
exports.preciseAdd = preciseAdd;
exports.preciseDiv = preciseDiv;
exports.preciseMul = preciseMul;
exports.preciseSub = preciseSub;
exports.roundTo = roundTo;
var _decimal = require("decimal.js");
const decimal = exports.decimal = _decimal.Decimal;
decimal.set({
precision: 20,
rounding: _decimal.Decimal.ROUND_HALF_UP
});
function preciseAdd(...args) {
return args.reduce((sum, num) => sum.plus(new _decimal.Decimal(num)), new _decimal.Decimal(0));
}
function preciseSub(a, b, ...moreNumbers) {
let result = new _decimal.Decimal(a).minus(new _decimal.Decimal(b));
for (const num of moreNumbers) result = result.minus(new _decimal.Decimal(num));
return result;
}
function preciseMul(...args) {
if (args.length === 0) return new _decimal.Decimal(0);
return args.reduce((product, num) => product.times(new _decimal.Decimal(num)), new _decimal.Decimal(1));
}
function preciseDiv(a, b, ...moreDivisors) {
let result = new _decimal.Decimal(a).dividedBy(new _decimal.Decimal(b));
for (const num of moreDivisors) result = result.dividedBy(new _decimal.Decimal(num));
return result;
}
function roundTo(num, decimalPlaces = 2) {
if (decimalPlaces < 0) throw new Error("Decimal places must be a non-negative integer");
return new _decimal.Decimal(num).toDecimalPlaces(decimalPlaces);
}
function compare(a, b) {
return new _decimal.Decimal(a).comparedTo(new _decimal.Decimal(b));
}
function calculatePercentage(part, total, options) {
if (Number(total) === 0) return "NaN";
const {
decimalPlaces = 2,
isSymbol = false
} = options || {};
if (isSymbol) {
return `${preciseDiv(part, total).times(100).toFixed(decimalPlaces)}%`;
} else {
return preciseDiv(part, total).times(100).toFixed(decimalPlaces);
}
}
class CalculatorChain {
value;
constructor(num) {
this.value = new _decimal.Decimal(num);
}
/**
* 加法
* @param num 数字或字符串
*/
add(num) {
this.value = this.value.plus(new _decimal.Decimal(num));
return this;
}
/**
* 减法
* @param num 数字或字符串
*/
sub(num) {
this.value = this.value.minus(new _decimal.Decimal(num));
return this;
}
/**
* 乘法
* @param num 数字或字符串
*/
mul(num) {
this.value = this.value.times(new _decimal.Decimal(num));
return this;
}
/**
* 除法
* @param num 数字或字符串
*/
div(num) {
if (Number(num) === 0) throw new Error("Cannot divide by zero");
this.value = this.value.dividedBy(new _decimal.Decimal(num));
return this;
}
/**
* round
* @param decimalPlaces 数字或字符串
* @returns Decimal
*/
round(decimalPlaces = 2) {
return this.value.toDecimalPlaces(decimalPlaces);
}
}
exports.CalculatorChain = CalculatorChain;