专栏
天翼云开发者社区

CDN网关超大range计算方法

2023-05-17 09:22:03 9阅读

一、目前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超大数的表示以及计算方法,其中方法包含:数值转换、补位、分段切割、借位、递归计算,从而得到最终结果

  • 0
  • 0
  • 0
0 评论
0/1000
评论(0) 发表评论
康****彬

康****彬

7 篇文章 0 粉丝
关注

CDN网关超大range计算方法

2023-05-17 09:22:03 9阅读

一、目前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超大数的表示以及计算方法,其中方法包含:数值转换、补位、分段切割、借位、递归计算,从而得到最终结果

文章来自专栏

CDN网关

4 篇文章 1 订阅
0 评论
0/1000
评论(0) 发表评论
  • 0
    点赞
  • 0
    收藏
  • 0
    评论