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
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Longmo Docs !