Skip to content

Number Precision Library

解决 JavaScript 数字精度问题的相关函数

基础使用

typescript
import { plus, minus, times, divide, round } from '@mgcloud/lib-utils'

// 加法
plus(0.1, 0.2) // => 0.3
plus(2.3, 2.4) // => 4.7

// 减法
minus(1.0, 0.9) // => 0.1
minus(0.3, 0.2) // => 0.1

// 乘法
times(3, 0.3) // => 0.9
times(0.362, 100) // => 36.2

// 除法
divide(1.21, 1.1) // => 1.1
divide(0.9, 3) // => 0.3

// 四舍五入
round(0.105, 2) // => 0.11
round(1.335, 2) // => 1.34

链式操作

typescript
import { createCalculator } from '@mgcloud/lib-utils'

// 创建计算器实例进行链式操作
const result = createCalculator(1.23456)
  .round(2)          // 1.23
  .plus(0.1)         // 1.33
  .minus(0.2)        // 1.13
  .times(2)          // 2.26
  .divide(0.3)       // 7.53333333333333
  .round(2)          // 7.53
  .valueOf()
typescript
// 也可以直接使用 NumberCalculator 类

import { NumberCalculator } from '@mgcloud/lib-utils'

const calc = new NumberCalculator(1.2345)
  .round(2)          // 1.23
  .plus(0.1)         // 1.33
  .valueOf()

API 文档

基础运算函数

  • plus(...numbers: NumberType[]): number

执行精确加法运算。

typescript
plus(0.1, 0.2)              // => 0.3
plus(0.1, 0.2, 0.3)         // => 0.6
plus(-1.6, -1)              // => -2.6
  • minus(...numbers: NumberType[]): number

执行精确减法运算。

typescript
minus(1.0, 0.9)             // => 0.1
minus(1, 0, 2, 3)           // => -4
minus(8893568.397103781249, -7.29674059550)  // => 8893575.693844376749
  • times(...numbers: NumberType[]): number

执行精确乘法运算。

typescript
times(0.7, 0.1)             // => 0.07
times(3, 0.3)               // => 0.9
times(0.362, 100)           // => 36.2
  • divide(...numbers: NumberType[]): number

执行精确除法运算。

typescript
divide(1.21, 1.1)           // => 1.1
divide(0.9, 3)              // => 0.3
divide(36.2, 0.362)         // => 100
  • round(num: NumberType, decimal: number): number

对数字进行指定小数位的四舍五入。

typescript
round(0.105, 2)             // => 0.11
round(1.335, 2)             // => 1.34
round(12345.105, 2)         // => 12345.11

工具函数

  • strip(num: NumberType, precision = 15): number

修正数字精度。

typescript
strip(0.09999999999999998)  // => 0.1
strip(1.0000000000000001)   // => 1
  • digitLength(num: NumberType): number

获取数字的小数位数。

typescript
digitLength(123.4567890123) // => 10
digitLength(1.23e-5)        // => 7
  • enableBoundaryChecking(flag = true): void

启用/禁用边界检查。

typescript
enableBoundaryChecking(false) // 禁用边界检查
enableBoundaryChecking()      // 启用边界检查

链式操作

createCalculator(value: NumberType): NumberCalculator

创建一个计算器实例,支持链式操作。

typescript
const calc = createCalculator(10)
  .plus(0.1)                // 10.1
  .minus(0.2)               // 9.9
  .times(2)                 // 19.8
  .divide(0.3)              // 66
  .round(2)                 // 66.00
  .valueOf()

类型定义

typescript
type NumberType = number | string  // 支持数字或数字字符串

注意事项

  1. 所有计算都是不可变的,不会修改原始数据
  2. 支持科学记数法的数字字符串 (如: '1.23e-4')
  3. 默认开启边界检查,对超过 JavaScript 安全数字的运算会发出警告
  4. 链式操作返回的计算器实例可以重复使用

兼容性

  • 支持所有现代浏览器
  • 支持 Node.js
  • 支持 TypeScript

错误处理

  • 所有计算函数都会对输入进行基本验证
  • 在可能导致精度丢失的情况下会通过控制台发出警告
  • 除数为 0 时会返回 Infinity

示例

typescript
// 常见的浮点数问题
0.1 + 0.2                   // => 0.30000000000000004
plus(0.1, 0.2)              // => 0.3

// 链式复杂计算
createCalculator(1.23456)
  .round(2)                 // 1.23
  .plus(0.1)                // 1.33
  .minus(0.2)               // 1.13
  .times(2)                 // 2.26
  .divide(0.3)              // 7.53333333333333
  .valueOf()

// 大量数字的累加
plus(...new Array(500).fill(1))  // => 500

导出方法

typescript
import {
  strip,
  plus,
  minus,
  times,
  divide,
  round,
  digitLength,
  float2Fixed,
  enableBoundaryChecking,
  NumberCalculator,
  createCalculator,
} from '@mgcloud/lib-utils'

Source

Source