日期与精确计算
日期函数可通过 qiqi.dayjs 或 @qiqi/dayjs 使用;精确计算通过 qiqi.math 或 @qiqi/math 的默认导入使用。
qiqi.dayjs
dayjs 模块提供了和日期时间相关的一些方法:
| 方法 | 描述 |
|---|---|
| add(date: Date, amount, unit?): Date | 返回增加一定时间的新的 Date 对象。add(new Date(), 1, 'year') |
| subtract(date: Date, amount, unit?): Date | 返回减去一定时间的新的 Date 对象。subtract(new Date(),1, 'year') |
| startOf(date: Date, unit): Date | 返回一个新的 Date 对象,并设置到一个时间的开始。startOf(new Date(), 'year') |
| endOf(date: Date, unit): Date | 返回一个新的 Date 对象,并设置到一个时间的末尾。endOf(new Date(), 'year') |
| diff(d1: Date, d2: Date, unit?): number | 返回指定单位下两个日期时间之间的差异。diff(d1,d2, 'month') |
| daysInMonth(date: Date): number | 获取当前月份包含的天数。 |
| isBefore(d1: Date, d2: Date, unit: QUnitType = 'date'): boolean | |
| isAfter(d1: Date, d2: Date, unit: QUnitType = 'date'): boolean | |
| isSame(d1: Date, d2: Date, unit: QUnitType = 'date'): boolean | |
| isBetween(d1: Date, d2: Date, unit: QUnitType = 'date'): boolean | |
| isToday(date: Date): boolean |
支持的 unit 列表
| 单位 | 缩写 | 详情 |
|---|---|---|
| day | d | 星期几 (星期天0,星期六6) |
| week | w | Week of Year |
| month | M | 月份 (一月 0, 十二月 11) |
| quarter | Q | 季度 |
| year | y | Year |
| hour | h | Hour |
| minute | m | Minute |
| second | s | Second |
| millisecond | ms | Millisecond |
qiqi.math
math 模块提供加、减、乘、除 等运算方法。
为什么要提供额外的计算方法? js中提供的运算操作符在处理浮点数时会导致精度问题, 比如:
0.55 * 100 // 55.00000000000001
0.3 - 0.1 // 0.19999999999999998
0.1 + 0.2 // 0.30000000000000004
decimal(x)
将基本数值包装成Decimal包装类型, 以便使用 Decimal对象下的操作方法
- 参数:
| 参数 | 说明 | 类型 | 必须 |
|---|---|---|---|
| x | 数值 | number | 是 |
- 返回值:Decimal
qiqi.math.div(10, 2).value //5
// 等同于:
qiqi.math.decimal(10).div(2).value //5
value
value 不是math的属性,是Decimal对象的属性, 用来获取值类型
- 返回值:number
qiqi.math.decimal(10).value // 10
add(x, y)
加法
- 参数:
| 参数 | 说明 | 类型 | 必须 |
|---|---|---|---|
| x | 加数 | number | |
| y | 加数 | number | 可选 |
- 返回值:Decimal
qiqi.math.add(0.1, 0.2).value //0.3
// 等同于:
qiqi.math.decimal(0.1).add(0.2).value
sub(x, y)
减法
- 参数:
| 参数 | 说明 | 类型 | 必须 |
|---|---|---|---|
| x | 被减数 | number | |
| y | 加数 | number | 可选 |
只传一个参数时, x是减数 传两个参数时, x 是被减数
- 返回值:Decimal
qiqi.math.sub(0.3, 0.2).value //0.1
// 等同于:
qiqi.math.decimal(0.3).sub(0.2).value //0.1
mul(x, y)
乘法
- 参数:
| 参数 | 说明 | 类型 | 必须 |
|---|---|---|---|
| x | 乘数 | number | |
| y | 乘数 | number | 可选 |
- 返回值:Decimal
qiqi.math.mul(3, 2).value //6
// 等同于:
qiqi.math.decimal(3).mul(2).value //6
div(x, y)
除法
- 参数:
| 参数 | 说明 | 类型 | 必须 |
|---|---|---|---|
| x | 被除数 | number | |
| y | 除数 | number | 可选 |
只传一个参数时, x是除数 传两个参数时, x 是被除数
- 返回值:Decimal
qiqi.math.div(10, 2).value //5
// 等同于:
qiqi.math.decimal(10).div(2).value //5
abs(x)
绝对值
- 参数:
| 参数 | 说明 | 类型 | 必须 |
|---|---|---|---|
| x | 取绝对值 | number | 可选 |
- 返回值:Decimal
qiqi.math.abs(-1).value //1
// 等同于:
qiqi.math.decimal(-1).abs().value //1
random(dp)
生成随机数
- 参数:
| 参数 | 说明 | 类型 | 必须 |
|---|---|---|---|
| dp | 小数位数 | number | 可选 |
- 返回值:Decimal
qiqi.math.random(10).value // '0.4117936847'
round(x)
返回与给出的数值表达式最接近的整数 (四舍五入)
- 参数:
| 参数 | 说明 | 类型 | 必须 |
|---|---|---|---|
| x | 取整的数 | number | 可选 |
qiqi.math.round(4.4).value // 4
qiqi.math.round(4.7).value // 5
// 等同于
qiqi.math.decimal(4.7).round().value
- 返回值:Decimal
floor(x)
返回小于等于其数值参数的 最大整数。
qiqi.math.floor(4.7).value // 4
// 等同于
qiqi.math.decimal(4.7).floor().value
- 参数:
| 参数 | 说明 | 类型 | 必须 |
|---|---|---|---|
| x | 取整的数 | number | 可选 |
- 返回值:Decimal
ceil(x)
返回大于等于其数字参数的最小整数。
qiqi.math.ceil(4.1).value // 5
qiqi.math.ceil(4.7).value // 5
// 等同于
qiqi.math.decimal(4.7).ceil().value
- 参数:
| 参数 | 说明 | 类型 | 必须 |
|---|---|---|---|
| x | 取整的数 | number | 可选 |
- 返回值:Decimal
toDP(dp, rounding?)
设置 Decimal 对象保留的小数位数。
qiqi.math.decimal(12.34567).toDP(2).value // 12.35
const y = qiqi.math.decimal(9876.56371);
y.toDP(3).value // 9876.564
y.toDP(1, 0).value // 9876.6
y.toDP(1, 1).value // 9876.5
y.toDP(1, 4).value // 9876.6
- 参数:
| 参数 | 说明 | 类型 | 必须 |
|---|---|---|---|
| dp | 保留的小数位数 | number | 必填 |
| rounding | 舍入模式 | number | 可选;0 向上、1 向下、4 四舍五入(默认) |
- 返回值:Decimal
警告
- 所有的运算函数,返回的是一个 Decimal 的包装对象, 这样可以做到链式调用,比如:
qiqi.math.add(5, 3).sub(2).mul(2)
计算结果返回的是一个对象,给 form表单的表单项赋值的时候需要调用value属性转化成数值
qiqi.math.add(1,2).value
运算函数的入参是数值, 传入Decimal对象是错误的:
const math = qiqi.math;
math.add(1, 2).div(math.sub(2,1)) // ☠ ️ 错误写法, div方法入参必须是数值
math.add(1, 2).div(math.sub(2,1).value) // 👍 正确写法
- 解构时只能解构到
math,不能再往下解构:
const math = qiqi.math;
math.add(1, 2); // 👍 正确写法
const add = math.add; // ☠️ 使用错误
add(1, 2) // ❌ 会包this指针错误