UNPKG

@ryanuo/utils

Version:

提供多种实用工具函数,涵盖算法、浏览器操作、网络请求等多个领域

104 lines (103 loc) 2.98 kB
"use strict"; 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;