P.S.
- 本文基于BigNumber.js文档,增加了个人的理解。
- 代码可以在BigNumber.js文档的控制台中测试。
定点表示法
定点表示法在整数位和分数位之间有一个小数点,类似于普通十进制数的整数和分数数字之间的小数点。
toFixed
参数
.toFixed([dp [, rm]]) ⇒ string
dp
整数。允许的范围为 [0 , 1e+9]
rm
整数。允许的范围为 [0 , 8]
说明
toFixed方法返回一个字符串,该字符串以正常(定点)表示法表示此 BigNumber 的值,使用 rm 指定的舍入模式舍入到 dp 指定的小数位。例如:
x = 66.666
y = new BigNumber(x)
y.toFixed(0) // '67'
y.toFixed(1) // '66.7'
y.toFixed(3) // '66.666'
y.toFixed(5) // '66.66600'
如果调用toFixed方法的BigNumber实例在正常表示法中的分数位小于参数 dp 指定的小数位,则返回值将相应地附加零到 dp 指定的小数位。如上面代码块中的y.toFixed(5) // '66.66600'。
使用 Number.prototype.toFixed 时,如果一个数字大于或等于 10^21,会按照指数表示法返回值。然而此方法与之不同,始终按照普通(定点)表示法返回值。
如果不传入参数 dp 或者向 dp 传入 null 或 undefined,则返回值将不舍入,并采用正常(定位)表示法。这也不同于 Number.prototype.toFixed ,后者将舍入到个位。例如:
x = 66.666
y = new BigNumber(x)
x.toFixed() // '67' 舍入到个位
y.toFixed() // '66.666' 不舍入
如果省略参数 rm ,亦或传入的 rm 是 null 或 undefined,则使用 ROUNDING_MODE 进行舍入。例如:
x = 66.666
y = new BigNumber(x)
y.toFixed(1) // '67.7' 使用默认的ROUNDING_MODE,即 4 (ROUND_HALF_UP)
y.toFixed(1, 1) // '66.6' 使用指定的ROUNDING_MODE,即 1 (ROUND_DOWN)
如果参数 dp 或 rm 不符合规范,则会抛出错误。请参阅文档中 错误 部分。
实践✨
Q: 怎样将一个浮点数截取到指定小数位x?
A: 使用BigNumber.toFixed(x, 1)或BigNumber.toFixed(x, 3)
toFormat
参数
.toFormat([dp [, rm[, format]]]) ⇒ string
dp
整数。允许的范围为 [0 , 1e+9]
rm
整数。允许的范围为 [0 , 8]
format
对象。参阅 FORMAT。默认值如下:
{
prefix: '', // 加在返回值前的字符串
decimalSeparator: '.', // 分隔整数部分和小数部分的符号
groupSeparator: ',', // 整数部分内部每一组之间的分隔符号
groupSize: 3, // 整数部分内部每一主要组的字符数
secondaryGroupSize: 0, // 整数部分内部每一次要组的字符数
fractionGroupSeparator: ' ', // 小数部分内部每一组之间的分隔符号
fractionGroupSize: 0, // 小数部分内部每一组的字符数
suffix: '' // 加在返回值后的字符串
}
说明
toFormat可以看作增加了format参数的toFixed。
默认的 fractionGroupSeparator 没有显示出效果是因为默认的 fractionGroupSize 为0,修改 fractionGroupSize 后就会看见默认的 fractionGroupSeparator 的效果。例如:
const fmt = {
prefix: '',
decimalSeparator: '.',
groupSeparator: ',',
groupSize: 3,
secondaryGroupSize: 0,
fractionGroupSeparator: ' ',
fractionGroupSize: 0,
suffix: ''
}
const x = new BigNumber('123456789.123456789')
BigNumber.config({ FORMAT: fmt })
x.toFormat() // '123,456,789.123456789'
fmt.fractionGroupSize = 5
x.toFormat() // '123,456,789.12345 6789'
上面的代码也说明只要传入 FORMAT 的对象的引用仍然保留着,对传入对象的修改会立即作用于BigNumber的格式。
实践✨
Q: 怎样在一个正BigNumber实例的整数部分中每三位插入一个逗号?
A: 直接使用BigNumber.toFormat(),默认的 groupSeparator 和 groupSize 已满足需求。