一、目前CDN網關openresty中的lua遇到兩個超大數值,計算兩個數值的差、和是不支持的,因為lua支持最大的數值的位數大小是19位,當數值大于 19位的時候,會自動變成指數類型,例如:1.22222e+19,并且兩個同位超大數值比較大小也是不支持的,如下(20位數):
local a = 11111111111111111111
local b = 11111111111111111222
print(a) = 1.1111111111111e+19
print(b) = 1.1111111111111e+19
print(a < b) = false (正常結果應為true)
print(a == b) = true(正常結果應為false)
因此,結果是無法比較的,也是無法計算,相減等于0。
二、可通過以下方式處理:
1、數值轉換-數字轉為字符串:針對兩個超大數值,數字先轉成字符串,A:大的字符串,B:小的字符串;
2、補位:對B的數值字符串進行補位,前面默認補0,使得兩個字符串長度一致;
3、分割字符串:針對A、B兩個字符串,按照每10位從頭進行分割(最后一段可能小于10位),記A1、A2……An,B1、B2……Bn,此時A1的長度=B1的長度,以此類推,保證兩個字符串的每一段數據的長度是一致的,方便后續計算;
4、字符串轉為數字:An和Bn轉為數字;
5、借位: A1必然大于B1,比較A2與B2,如果A2<B2,則A2向A1借一位,A1=A1-1,A2=A2+10^10,依此類推,最后比較An,Bn,如果An<Bn,則(An-1)=(An-1)-1,An=An+10^(具體位數);
6、遞歸計算:分段計算得出結果,R1=A1-B1,R2=A2-B2……Rn=An-Bn,得到結果之后,把R1到R2轉成字符串,最后R1到Rn拼接起來得到最終計算結果。
結果:lua超大數的表示以及計算方法,其中方法包含:數值轉換、補位、分段切割、借位、遞歸計算,從而得到最終結果