mirror of
https://github.com/fofolee/uTools-quickcommand.git
synced 2025-12-14 22:54:32 +08:00
文件分类新增压缩解压,数学分类新增统计、几何、三角、单位换算
This commit is contained in:
165
plugin/lib/quickcomposer/math/basic.js
Normal file
165
plugin/lib/quickcomposer/math/basic.js
Normal file
@@ -0,0 +1,165 @@
|
||||
/**
|
||||
* 基本算术运算
|
||||
* @param {string} expression 算术表达式
|
||||
* @returns {number} 计算结果
|
||||
*/
|
||||
function evaluate(expression) {
|
||||
// 移除所有空白字符
|
||||
expression = expression.replace(/\s+/g, "");
|
||||
|
||||
// 检查表达式是否为空
|
||||
if (!expression) {
|
||||
throw new Error("表达式不能为空");
|
||||
}
|
||||
|
||||
// 检查表达式是否包含非法字符
|
||||
if (!/^[0-9+\-*/().]+$/.test(expression)) {
|
||||
throw new Error("表达式包含非法字符");
|
||||
}
|
||||
|
||||
// 检查括号是否匹配
|
||||
let bracketCount = 0;
|
||||
for (const char of expression) {
|
||||
if (char === "(") bracketCount++;
|
||||
if (char === ")") bracketCount--;
|
||||
if (bracketCount < 0) {
|
||||
throw new Error("括号不匹配");
|
||||
}
|
||||
}
|
||||
if (bracketCount !== 0) {
|
||||
throw new Error("括号不匹配");
|
||||
}
|
||||
|
||||
try {
|
||||
// 使用 Function 构造函数创建一个安全的计算环境
|
||||
const result = new Function(`return ${expression}`)();
|
||||
|
||||
// 检查结果是否为有限数
|
||||
if (!Number.isFinite(result)) {
|
||||
throw new Error("计算结果无效");
|
||||
}
|
||||
|
||||
return result;
|
||||
} catch (error) {
|
||||
throw new Error("表达式计算错误: " + error.message);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 计算阶乘
|
||||
* @param {number} n 非负整数
|
||||
* @returns {number} 阶乘结果
|
||||
*/
|
||||
function factorial(n) {
|
||||
if (!Number.isInteger(n)) {
|
||||
throw new Error("阶乘只能计算整数");
|
||||
}
|
||||
if (n < 0) {
|
||||
throw new Error("阶乘不能计算负数");
|
||||
}
|
||||
if (n > 170) {
|
||||
throw new Error("数字过大,可能导致溢出");
|
||||
}
|
||||
|
||||
let result = 1;
|
||||
for (let i = 2; i <= n; i++) {
|
||||
result *= i;
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* 计算绝对值
|
||||
* @param {number} x 数字
|
||||
* @returns {number} 绝对值
|
||||
*/
|
||||
function abs(x) {
|
||||
return Math.abs(x);
|
||||
}
|
||||
|
||||
/**
|
||||
* 向上取整
|
||||
* @param {number} x 数字
|
||||
* @returns {number} 向上取整结果
|
||||
*/
|
||||
function ceil(x) {
|
||||
return Math.ceil(x);
|
||||
}
|
||||
|
||||
/**
|
||||
* 向下取整
|
||||
* @param {number} x 数字
|
||||
* @returns {number} 向下取整结果
|
||||
*/
|
||||
function floor(x) {
|
||||
return Math.floor(x);
|
||||
}
|
||||
|
||||
/**
|
||||
* 四舍五入
|
||||
* @param {number} x 数字
|
||||
* @param {number} [decimals=0] 保留小数位数
|
||||
* @returns {number} 四舍五入结果
|
||||
*/
|
||||
function round(x, decimals = 0) {
|
||||
if (!Number.isInteger(decimals) || decimals < 0) {
|
||||
throw new Error("小数位数必须是非负整数");
|
||||
}
|
||||
const factor = Math.pow(10, decimals);
|
||||
return Math.round(x * factor) / factor;
|
||||
}
|
||||
|
||||
/**
|
||||
* 计算平方根
|
||||
* @param {number} x 非负数
|
||||
* @returns {number} 平方根
|
||||
*/
|
||||
function sqrt(x) {
|
||||
if (x < 0) {
|
||||
throw new Error("不能计算负数的平方根");
|
||||
}
|
||||
return Math.sqrt(x);
|
||||
}
|
||||
|
||||
/**
|
||||
* 计算幂
|
||||
* @param {number} base 底数
|
||||
* @param {number} exponent 指数
|
||||
* @returns {number} 幂运算结果
|
||||
*/
|
||||
function pow(base, exponent) {
|
||||
const result = Math.pow(base, exponent);
|
||||
if (!Number.isFinite(result)) {
|
||||
throw new Error("计算结果超出范围");
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* 计算对数
|
||||
* @param {number} x 正数
|
||||
* @param {number} [base=Math.E] 底数
|
||||
* @returns {number} 对数值
|
||||
*/
|
||||
function log(x, base = Math.E) {
|
||||
if (x <= 0) {
|
||||
throw new Error("对数只能计算正数");
|
||||
}
|
||||
if (base <= 0 || base === 1) {
|
||||
throw new Error("对数的底数必须是大于0且不等于1的数");
|
||||
}
|
||||
|
||||
return base === Math.E ? Math.log(x) : Math.log(x) / Math.log(base);
|
||||
}
|
||||
|
||||
module.exports = {
|
||||
evaluate,
|
||||
factorial,
|
||||
abs,
|
||||
ceil,
|
||||
floor,
|
||||
round,
|
||||
sqrt,
|
||||
pow,
|
||||
log,
|
||||
};
|
||||
Reference in New Issue
Block a user