跳到主要内容

日期与精确计算

日期函数可通过 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 列表

单位缩写详情
dayd星期几 (星期天0,星期六6)
weekwWeek of Year
monthM月份 (一月 0, 十二月 11)
quarterQ季度
yearyYear
hourhHour
minutemMinute
secondsSecond
millisecondmsMillisecond

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
警告
  1. 所有的运算函数,返回的是一个 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) // 👍 正确写法


  1. 解构时只能解构到 math,不能再往下解构:

const math = qiqi.math;

math.add(1, 2); // 👍 正确写法

const add = math.add; // ☠️ 使用错误
add(1, 2) // ❌ 会包this指针错误