zoukankan      html  css  js  c++  java
  • 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里面的小数使用方法

  • 相关阅读:
    解决GOOGLE不能用的办法
    Elmah错误日志工具
    Linq 更改主键值
    qcow2、raw、vmdk等镜像格式
    Ceph相关博客、网站(256篇OpenStack博客)
    Delphi中inherited问题
    Qt qss一些伪装态,以及margin与padding区别
    Qt双缓冲机制:实现一个简单的绘图工具(纯代码实现)
    写出一篇好博文需要用到的工具
    最短路径启蒙题
  • 原文地址:https://www.cnblogs.com/pk-run/p/4444582.html
Copyright © 2011-2022 走看看