# 实用封装函数

URL: https://caijiao.org/decimaljs/12-appendix/03-utils
Source: docs/decimaljs/12-appendix/03-utils.md
Description: 提供一些基于 decimal.js 的常用封装函数，简化高精度数值计算的使用，提高开发效率和代码可读性。

以下封装函数基于 decimal.js，适用于常见的高精度计算场景，方便快速调用。

## 1. 安全转换为 Decimal

确保输入被安全转换为 Decimal 实例，避免异常。

```js
import Decimal from 'decimal.js';

export function toDecimal(value) {
  try {
    if (value instanceof Decimal) {
      return value;
    }
    if (value === null || value === undefined || value === '') {
      return new Decimal(0);
    }
    return new Decimal(value);
  } catch (e) {
    console.warn('Invalid decimal input:', value);
    return new Decimal(0);
  }
}
````

## 2. 精确加法

```js
export function add(a, b) {
  return toDecimal(a).plus(toDecimal(b));
}
```

## 3. 精确减法

```js
export function subtract(a, b) {
  return toDecimal(a).minus(toDecimal(b));
}
```

## 4. 精确乘法

```js
export function multiply(a, b) {
  return toDecimal(a).times(toDecimal(b));
}
```

## 5. 精确除法

```js
export function divide(a, b) {
  const divisor = toDecimal(b);
  if (divisor.isZero()) {
    throw new Error('Division by zero');
  }
  return toDecimal(a).div(divisor);
}
```

## 6. 格式化为指定小数位字符串

支持舍入模式，默认四舍五入。

```js
export function formatDecimal(value, decimalPlaces = 2, roundingMode = Decimal.ROUND_HALF_UP) {
  return toDecimal(value).toDecimalPlaces(decimalPlaces, roundingMode).toFixed(decimalPlaces);
}
```

## 7. 判断数值是否为正数（含零）

```js
export function isPositive(value) {
  return toDecimal(value).isPositive() || toDecimal(value).isZero();
}
```

## 8. 判断数值是否为负数

```js
export function isNegative(value) {
  return toDecimal(value).isNegative();
}
```

## 9. 链式调用示例

```js
export function calcExample(a, b, c) {
  return toDecimal(a)
    .plus(b)
    .times(c)
    .toDecimalPlaces(4, Decimal.ROUND_HALF_UP);
}
```

---

以上封装函数适合日常开发中快速处理高精度数字，便于维护和扩展。

根据业务需求可进一步丰富和定制功能。
