场景:最近做IoT项目的时候碰到一个问题,涉及到双精度浮点型的数据范围的校验问题。业务上其实有三种类型:int、float和double类型三种。他们的范围分别是:
//int
int: ['-2147483648', '2147483647'],
//float
float: ['-340282346638528860000000000000000000000', '340282346638528860000000000000000000000'],
//double (简写方式)
double: ['-1.7976931348623157E+308', '1.7976931348623157E+308'],
// double(具体数值)
['-179769313486231570000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000', '179769313486231570000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'], // 阿里云的校验范围,精确到17976931348623157
我需要做的工作就是在选择完不同的类型时,校验用户的数在对应的范围里。
其实int和float类型还好吧,但是double这个数太大,超级大,我之前希望可以将这个具体的数可以确定到具体的值,而不是“1.7976931348623157E+308”这种,精确到小数点后16位。不过好在我去咨询了阿里云的IoT平台,提交工单问了这个问题之后,按照他们的来:
按照阿里这个最大的数据来校验即可。
那么也引出了今天的主要内容:bignumber.js
个人觉得这个还是很好用的,因为它最巧妙的在于将一个非常大的数,利用数组,将其分割成为若干的小数,这样就很好控制每一个部分,然后再配合定义好的正负和指数,就可以将这个数表示出来。
然后介绍一下其中的两个很好用的比较大小的函数:
不过首先需要给用户输入的值也经过BigNumber 处理
(1)isLessThan()
import BigNumber from 'bignumber.js'
//输入值
const bigVal = BigNumber(val)
//最小值
const bigMin = BigNumber(min)
//返回 true 或者 false
bigVal.isLessThan(bigMin)
console.log('这个数小于最小值?', bigVal.isLessThan(bigMin))
(2)isGreaterThan()
import BigNumber from 'bignumber.js'
//输入值
const bigVal = BigNumber(val)
//最大值
const bigMax = BigNumber(max)
//返回 true 或者 false
bigVal.isGreaterThan(bigMax)
console.log('这个数大于最大值?', bigVal.isGreaterThan(bigMax))