本文讲述的是 bignumber.js 这个库的静态属性,其实网上解释很多,但是感觉很多人都说不明白,写这篇文章的目的通过我的理解让更多的人更加容易理解和记住他们的含义
BigNumber 有一些静态的属性,代表不同的含义
ROUND_DOWN
ROUND_UP
ROUND_CEIL
ROUND_FLOOR
ROUND_HALF_DOWN
ROUND_HALF_UP
ROUND_HALF_CEIL
ROUND_HALF_FLOOR
其中有一些我们会感觉很相似,比如 ROUND_UP 和 ROUND_CEIL,又或者 ROUND_DOWN 和 ROUND_FLOOR
1. ROUND_UP => 向上取数,这个上不是指往大的方向取数,你可以理解为 往远离 0 的方向取数,或者说是向无穷的方向
BigNumber(1.111).toFixed(2, BigNumber.ROUND_UP) // 1.12
BigNumber(-1.111).toFixed(2, BigNumber.ROUND_UP) // -1.12
BigNumber(1.115).toFixed(2, BigNumber.ROUND_UP) // 1.12
BigNumber(-1.115).toFixed(2, BigNumber.ROUND_UP) // -1.12
2. ROUND_CEIL => 向大取数,就像我们常用的 Math.ceil,它会向更大取数
BigNumber(1.114).toFixed(2, BigNumber.ROUND_CEIL) // 1.12
BigNumber(-1.114).toFixed(2, BigNumber.ROUND_CEIL) // -1.11
BigNumber(1.115).toFixed(2, BigNumber.ROUND_CEIL) // 1.12
BigNumber(-1.115).toFixed(2, BigNumber.ROUND_CEIL) // -1.11
同理可得
3. ROUND_DOWN => 向下取数,这个下不是指往小的方向取数,你可以理解为 往趋近 0 的方向取数
4. ROUND_FLOOR => 向小取数 ,就像我们常用的 Math.floor,它会向更小取数
=========================================================================
那么 ROUND_HALF_UP 和 ROUND_UP 的区别是什么呢?
因为 HALF 是一半的意思,可以理解为 一半遵循我的逻辑,这个一半包含中间的数
5. ROUND_HALF_UP => 一半向上取数,因为它是远离 0 来取数的,所以一半对他来讲就是离 0 更远的一半,和四舍五入一样
举个例子
BigNumber(1.114).toFixed(2, BigNumber.ROUND_HALF_UP) // 1.11
BigNumber(-1.114).toFixed(2, BigNumber.ROUND_HALF_UP) // -1.11
BigNumber(1.115).toFixed(2, BigNumber.ROUND_HALF_UP) // 1.12
BigNumber(-1.115).toFixed(2, BigNumber.ROUND_HALF_UP) // -1.12
6. ROUND_HALF_DOWN => 一半向下取数,因为它是接近 0 来取数的,所以一半对他来讲就是离 0 更近的一半
BigNumber(1.115).toFixed(2, BigNumber.ROUND_HALF_DOWN) // 1.11
BigNumber(-1.115).toFixed(2, BigNumber.ROUND_HALF_DOWN) // -1.11
BigNumber(1.116).toFixed(2, BigNumber.ROUND_HALF_DOWN) // 1.12
BigNumber(-1.116).toFixed(2, BigNumber.ROUND_HALF_DOWN) // -1.12
同理可得
7. ROUND_HALF_CEIL => 一半向大取数,因为它是根据从小到大取数的,所以一半对他来讲就是更大的数
8. ROUND_HALF_FLOOR => 一半向小取数,因为它是根据从大到小取数的,所以一半对他来讲就是更小的数
综上说的就是他们只管他们绿色框框里的数字,如果不是绿色框框里的数字,就会根据四舍五入进行计算。
注意:
BigNumber 默认处理方式使用的是 ROUNDING_MODE,ROUNDING_MODE 的默认参数是 ROUND_HALF_UP
补充:
设置 ROUNDING_MODE 的方式如下,如果不设置采用的就是它的默认值 ROUND_HALF_UP
BigNumber.config({ ROUNDING_MODE: 0 })
BigNumber.set({ ROUNDING_MODE: BigNumber.ROUND_UP }) // 等同于上边
举例:
BigNumber(1.115).toFixed(2) // 1.12
BigNumber.set({ ROUNDING_MODE: BigNumber.ROUND_DOWN })
BigNumber(1.115).toFixed(2) // 1.11