Skip to content

calcUtils.ts

作者:Long Mo
字数统计:1.3k 字
阅读时长:6 分钟
展开查看源码
typescript
import { Decimal } from "decimal.js";
import { isNumber } from "lodash-es";

enum FixedMode {
	ROUND_UP = "ROUND_UP",
	ROUND_DOWN = "ROUND_DOWN",
	ROUND_HALF_UP = "ROUND_HALF_UP",
}

type ModeType = keyof typeof FixedMode;

// 格式化数字:百分比显示
export const formatNumPercent = (num: number) => {
	return num.toLocaleString("zh-CN", {
		style: "percent",
		minimumFractionDigits: 2, // 限制两位 // useGrouping: false // 如果百分比不用分割符可设置此属性
	});
};

// 格式化数字--转换为形如 1,000,000,000
export const formatNum = (num: number) => {
	return num.toLocaleString("zh-CN", {
		minimumFractionDigits: 0,
		maximumFractionDigits: 9,
	});
};

// 四舍五入并保留位数
export const fixedNum = (
	a: number,
	bits: number = 2,
	mode: ModeType = "ROUND_HALF_UP"
) => {
	return new Decimal(a).toFixed(bits, Decimal[mode]);
};

// 两数相加

export const addNum = (a: number, b: number) => {
	if (isNumber(a) && isNumber(b)) {
		return new Decimal(a).add(new Decimal(b)).toNumber();
	}
	return 0;
};

// 两数相减
export const subNum = (a: number, b: number) => {
	if (isNumber(a) && isNumber(b)) {
		return new Decimal(a).sub(new Decimal(b)).toNumber();
	}
	return 0;
};

// 两数相乘
export const mulNum = (a: number, b: number) => {
	if (isNumber(a) && isNumber(b)) {
		return new Decimal(a).mul(new Decimal(b)).toNumber();
	}
	return 0;
};

// 两数相除,注意除数不能为0
export const divNum = (a: number, b: number) => {
	if (isNumber(a) && isNumber(b)) {
		return new Decimal(a).div(new Decimal(b === 0 ? 0.01 : b)).toNumber();
	}
	return 0;
};

// 计算总数
export const sumNum = (args: number[]) => {
	return Decimal.sum(...args).toNumber();
};

// 找最大值
export const maxNum = (args: number[]) => {
	return Decimal.max(...args).toNumber();
};

// 找最小值
export const minNum = (args: number[]) => {
	return Decimal.min(...args).toNumber();
};

// 向下取整
export const floorNum = (a: number) => {
	return Decimal.floor(a).toNumber();
};

// 向上取整
export const ceilNum = (a: number) => {
	return Decimal.ceil(a).toNumber();
};

// 取绝对值
export const absNum = (a: number) => {
	const b = new Decimal(a).absoluteValue().toNumber();
	return b;
};

// 判断一个数字是否是另一个数字的倍数
export const judgeIsMultiple = (num: number, num2: number) => {
	const numDecimal = new Decimal(num);
	const num2Decimal = new Decimal(num2);
	return numDecimal.mod(num2Decimal).eq(0);
};

// 计算平均数
export const avgNum = (numbers: number[]): number => {
	if (numbers.length === 0) return 0;
	const sum = Decimal.sum(...numbers);
	return sum.dividedBy(numbers.length).toNumber();
};

// 求幂运算
export const powNum = (base: number, exponent: number): number => {
	const baseDecimal = new Decimal(base);
	return baseDecimal.pow(exponent).toNumber();
};

// 对数字进行对数运算(自然对数)
export const logNum = (num: number): number => {
	const numDecimal = new Decimal(num);
	return numDecimal.log().toNumber();
};

// 将数字转换为科学记数法字符串
export const toScientificNotation = (num: number): string => {
	const numDecimal = new Decimal(num);
	return numDecimal.toExponential();
};

// 判断是否为整数
export const isInteger = (num: number): boolean => {
	return Number.isInteger(num) || new Decimal(num).isInteger();
};

// 计算给定数组的标准差
export const stdDeviation = (numbers: number[]): number => {
	if (numbers.length < 2) return 0;

	const mean = avgNum(numbers);
	const variance =
		numbers.reduce((acc, val) => acc + Math.pow(val - mean, 2), 0) /
		(numbers.length - 1);
	return Math.sqrt(variance);
};

/**
 * clamp夹钳 返回  min < value < max
 * @param value
 * @param min
 * @param max
 * @returns {number}
 */
export function clamp(value: number, min: number, max: number) {
	if (isNumber(value) && isNumber(min) && isNumber(max)) {
		if (min > max) {
			[min, max] = [max, min];
		}
		return Math.min(Math.max(value, min), max);
	}
	return 0;
}

** calcUtils.ts 使用文档及示例:**

请将 './yourFile' 替换为实际导入该模块的路径。

formatNumPercent: 将数字格式化为百分比字符串。

typescript
import { formatNumPercent } from './yourFile';

// 示例:
const percentValue = 0.23;
const formatted = formatNumPercent(percentValue);
console.log(formatted); // 输出:"23%"

formatNum: 格式化数字,添加千分位分隔符并限制小数位数。

typescript
import { formatNum } from './yourFile';

// 示例:
const largeNumber = 123456789.12345;
const formatted = formatNum(largeNumber);
console.log(formatted); // 输出:"123,456,789"

fixedNum: 四舍五入数字到指定的小数位数。

typescript
import { fixedNum } from './yourFile';

// 示例:
const roundedNum = fixedNum(123.4567, 2, FixedMode.ROUND_HALF_UP);
console.log(roundedNum); // 输出:"123.46"

数学运算函数:

typescript
import { addNum, subNum, mulNum, divNum } from './yourFile';

const a = 10.5;
const b = 2.3;

console.log(addNum(a, b)); // 输出:12.8
console.log(subNum(a, b)); // 输出:8.2
console.log(mulNum(a, b)); // 输出:24.15
console.log(divNum(a, b)); // 输出:4.5652173913043478 (或接近的值)

高级数学函数:

typescript
import { sumNum, maxNum, minNum, floorNum, ceilNum, absNum } from './yourFile';

const numbers = [1.23, 4.56, -7.89, 10.12];

console.log(sumNum(numbers)); // 输出:7.92(所有数字之和)
console.log(maxNum(numbers)); // 输出:10.12(最大值)
console.log(minNum(numbers)); // 输出:-7.89(最小值)
console.log(floorNum(3.14159)); // 输出:3(向下取整)
console.log(ceilNum(3.14159)); // 输出:4(向上取整)
console.log(absNum(-23)); // 输出:23(绝对值)

// 判断倍数关系
console.log(judgeIsMultiple(12, 3)); // 输出:true(12 是 3 的倍数)

avgNum: 计算一组数字的平均值。

typescript
import { avgNum } from './yourFile';

// 示例:
const numbers = [1, 2, 3, 4, 5];
const average = avgNum(numbers);
console.log(average); // 输出:3

powNum: 计算一个数的幂。

typescript
import { powNum } from './yourFile';

// 示例:
const base = 2;
const exponent = 3;
const result = powNum(base, exponent);
console.log(result); // 输出:8

logNum: 计算一个数的自然对数。

自然对数是以常数e为底数的对数。 在物理学,生物学等自然科学中有重要的意义,一般表示方法为lnx。

typescript
import { logNum } from './yourFile';

// 示例:
const number = 10;
const naturalLog = logNum(number);
console.log(naturalLog); // 输出:2.302585092994046 (近似值)

toScientificNotation: 将一个数字转换为科学记数法表示的字符串。

typescript
import { toScientificNotation } from './yourFile';

// 示例:
const num = 1234567;
const sciNotation = toScientificNotation(num);
console.log(sciNotation); // 输出:"1.234567e+6"

isInteger: 判断一个数是否为整数。

typescript
import { isInteger } from './yourFile';

// 示例:
const num1 = 123;
const num2 = 123.45;
console.log(isInteger(num1)); // 输出:true
console.log(isInteger(num2)); // 输出:false

stdDeviation: 计算一组数字的标准差。

typescript
import { stdDeviation } from './yourFile';

// 示例:
const nums = [1, 2, 3, 4, 5];
const standardDeviation = stdDeviation(nums);
console.log(standardDeviation); // 输出:1.4142135623730951(近似值)

函数名称:clamp

功能描述:该函数用于限制一个数值 value 在指定的最小值(min)和最大值(max)之间。如果 value 小于 min,则返回 min;如果 value 大于 max,则返回 max;否则,返回原 value。

输入参数:

value: 需要被限制的数值。 min: 最小允许值。 max: 最大允许值。 返回值:经过限制处理后的数值,确保其在 [min, max] 区间内。

示例:

ts
import { clamp } from './yourFile';

// 示例1:将10限制在5到15之间
const clampedValue1 = clamp(10, 5, 15);
console.log(clampedValue1); // 输出:10

// 示例2:将3限制在5到15之间
const clampedValue2 = clamp(3, 5, 15);
console.log(clampedValue2); // 输出:5 (因为3小于最小值5)

// 示例3:将20限制在5到15之间
const clampedValue3 = clamp(20, 5, 15);
console.log(clampedValue3); // 输出:15 (因为20大于最大值15)

Contributors

Long Mo
文章作者:Long Mo
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Longmo Docs