場景:最近做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))