CDN閘道器超大range計算方法

天翼雲開發者社群發表於2023-05-18

本文分享自天翼雲開發者社群《 CDN閘道器超大range計算方法 》,作者: ****彬https://www.ctyun.cn/developer/article/418155452207173

一、目前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超大數的表示以及計算方法,其中方法包含:數值轉換、補位、分段切割、借位、遞迴計算,從而得到最終結果


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/70014251/viewspace-2953023/,如需轉載,請註明出處,否則將追究法律責任。

相關文章