天翼云是中国电信倾力打造的云服务品牌,致力于成为领先的云计算服务提供商。提供云主机、cdn、云电脑、大数据及ai等全线产品和场景化凯发app官方网站的解决方案。
分类: 云计算
2023-05-19 10:10:40
本文分享自天翼云开发者社区《》,作者:康****彬
一、目前cdn网关openresty中的lua遇到两个超大数值,计算两个数值的差、和是不支持的,因为lua支持{banned}最佳大的数值的位数大小是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位从头进行分割({banned}最佳后一段可能小于10位),记a1、a2……an,b1、b2……bn,此时a1的长度=b1的长度,以此类推,保证两个字符串的每一段数据的长度是一致的,方便后续计算;
4、字符串转为数字:an和bn转为数字;
5、借位: a1必然大于b1,比较a2与b2,如果a2
6、递归计算:分段计算得出结果,r1=a1-b1,r2=a2-b2……rn=an-bn,得到结果之后,把r1到r2转成字符串,{banned}最佳后r1到rn拼接起来得到{banned}最佳终计算结果。
结果:lua超大数的表示以及计算方法,其中方法包含:数值转换、补位、分段切割、借位、递归计算,从而得到{banned}最佳终结果