lua实现大数字的四则运算

在使用redis的过程中,用到了lua脚本;其中在进行long型数字的计算的时候,总是无法获取到精确的计算值;因此根据使用情况通过字符串的相关处理实现了大数字的四则运算。

local stepNum = 10000
local function build(str)
    local n, c, s = math.floor(#str / 4), {}, 1
    if #str % 4 ~= 0 then
        c[n + 1], s = tonumber(string.sub(str, 1, #str % 4)), #str % 4 + 1
    end
    for i = n, 1, -1 do
        c[i], s = tonumber(string.sub(str, s, s + 3)), s + 4
    end
    return c
end

local function get(c)
    local r = ""
    for i = #c, 1, -1 do
        if tonumber(c[#c]) < 0 and tonumber(c[i]) > 0 then
            local v = math.pow(10, #c[i]) - tonumber(c[i])
            r = string.sub(r, 1, #r - 1) .. tostring(tonumber(string.sub(r, #r)) - 1) .. tostring(v)
        else
            if r ~= '' or tonumber(c[i]) ~= 0 then
                r = r .. c[i]
            end
        end
    end
    return r ~= '' and r or '0'
end

local function add(a, b)
    local c, d = {}, 0
    a, b = build(a), build(b)
    local count = math.max(#a, #b)
    for i = 1, count, 1 do
        local t = d + (a[i] or 0) + (b[i] or 0)
        c[i], d = tostring(t), 0
        if i ~= count then
            c[i], d = tostring(t % stepNum), math.floor(t/ stepNum)
        end
    end
    return get(c)
end

local function sub(a, b)
    local c, d = {}, 0
    a, b = build(a), build(b)
    local count = math.max(#a, #b)
    for i = 1, count, 1 do
        local t = d + (a[i] or 0) - (b[i] or 0)
        d = 0
        if i ~= count and t < 0 then
            t, d = t + stepNum, -1
        end
        c[i] = tostring(t)
    end
    return get(c)
end

local function multi(a, b)

end

local function div(a, b)

end

local c = add("1234567891234567890", "1234000000000000220")
print(c)
print(add('1200', '130000000'))
print(add('1200', '1300'))
print(sub('1200', '1300'))
print(sub('1300', '1200'))
print(sub('123456789', '123456789'))
print(sub('123456789', '1234567890123'))
print(sub('1234567890123', '123456789'))

欢迎指正错误,如果有更好的实现方法,欢迎与我分享~
最新代码,参见:GitHub代码地址

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值