51 lines
1.3 KiB
JavaScript
51 lines
1.3 KiB
JavaScript
|
|
// 优化后的工具文件 utils/PrecisionHandler.js
|
||
|
|
import Decimal from 'decimal.js';
|
||
|
|
|
||
|
|
// 关键:设置足够高的精度并禁止自动转换为数字
|
||
|
|
Decimal.set({
|
||
|
|
precision: 30,
|
||
|
|
toExpNeg: -999, // 避免小数字自动转为科学计数法
|
||
|
|
toExpPos: 999 // 避免大数字自动转为科学计数法
|
||
|
|
});
|
||
|
|
|
||
|
|
export default {
|
||
|
|
// 确保输入是字符串类型以保留完整精度
|
||
|
|
toDecimal(num) {
|
||
|
|
// 如果是数字先转为字符串,避免精度丢失
|
||
|
|
if (typeof num === 'number') {
|
||
|
|
num = num.toString();
|
||
|
|
}
|
||
|
|
return new Decimal(num);
|
||
|
|
},
|
||
|
|
|
||
|
|
// 加法
|
||
|
|
add(num1, num2) {
|
||
|
|
return this.toDecimal(num1).plus(this.toDecimal(num2));
|
||
|
|
},
|
||
|
|
|
||
|
|
// 减法
|
||
|
|
subtract(num1, num2) {
|
||
|
|
return this.toDecimal(num1).minus(this.toDecimal(num2));
|
||
|
|
},
|
||
|
|
|
||
|
|
// 乘法
|
||
|
|
multiply(num1, num2) {
|
||
|
|
return this.toDecimal(num1).times(this.toDecimal(num2));
|
||
|
|
},
|
||
|
|
|
||
|
|
// 除法
|
||
|
|
divide(num1, num2) {
|
||
|
|
return this.toDecimal(num1).dividedBy(this.toDecimal(num2));
|
||
|
|
},
|
||
|
|
|
||
|
|
// 四舍五入保留指定小数位(返回字符串,避免转换丢失)
|
||
|
|
round(num, decimalPlaces = 2) {
|
||
|
|
return this.toDecimal(num).toFixed(decimalPlaces);
|
||
|
|
},
|
||
|
|
|
||
|
|
// 转换为数字(仅在确定不会丢失精度时使用)
|
||
|
|
toNumber(decimal) {
|
||
|
|
return decimal.toNumber();
|
||
|
|
}
|
||
|
|
};
|