• lua保留n位小数方法


    time:2015/04/21

    1. string.format()

    function GetPreciseDecimal(nNum, n)
        if type(nNum) ~= "number" then
            return nNum;
        end
        
        n = n or 0;
        n = math.floor(n)
        local fmt = '%.' .. n .. 'f'
        local nRet = tonumber(string.format(fmt, nNum))
    
        return nRet;
    end

    后记:2015/06/25

    问题:string.format("%.xf", nNum)会对nNum进行四舍五入(同C语言中的printf的格式符一样)。所以这种方法也是有问题的,用的人请注意

    举例:

    1. GetPreciseDecimal(0.38461538461538) =     0.4

    2. 求余的方法

    function GetPreciseDecimal(nNum, n)
        if type(nNum) ~= "number" then
            return nNum;
        end
        n = n or 0;
        n = math.floor(n)
        if n < 0 then
            n = 0;
        end
        local nDecimal = 1/(10 ^ n)
        if nDecimal == 1 then
            nDecimal = nNum;
        end
        local nLeft = nNum % nDecimal;
        return nNum - nLeft;
    end

    结果:

    2. GetPreciseDecimal(0.38461538461538) =     0.3

    问题:在lua下面,存在0.7 % 0.1 = 0.1的情况,所以上面写法错误

    举例:

    2. GetPreciseDecimal(0.7) =     0.6

    解决:见3.修订,不使用求余方法

    3. 求余方法(修订)

    function GetPreciseDecimal(nNum, n)
        if type(nNum) ~= "number" then
            return nNum;
        end
        n = n or 0;
        n = math.floor(n)
        if n < 0 then
            n = 0;
        end
        local nDecimal = 10 ^ n
        local nTemp = math.floor(nNum * nDecimal);
        local nRet = nTemp / nDecimal;
        return nRet;
    end

    测试:

    3. GetPreciseDecimal(0.38461538461538) =     0.7
    3. GetPreciseDecimal(0.7) =     0.7

    待测:不知道还有没有其他问题

    4. 总结:

    (1)小心lua里面的小数使用方法

  • 相关阅读:
    cp
    usr/sbin/inetd
    mysql
    Iptables的规则语法
    CentOS系统安装过程中配置软RAID-0或RAID-1
    25道shell面试题
    虚拟机
    进入单用户模式
    正则表达式
    js操作div的显隐
  • 原文地址:https://www.cnblogs.com/pk-run/p/4444582.html
Copyright © 2020-2023  润新知