【问题标题】:Javascript VS PHP roundingJavascript VS PHP 舍入
【发布时间】:2011-06-22 08:33:53
【问题描述】:

我在使用 PHP 和 javascript 整数的方式时遇到了一些问题。我正在使用 PHP 的 round 函数和这个 javascript 函数:

function roundNumber(number, decimals) {     
    var newnumber = new Number(number+'').toFixed(parseInt(decimals));
    var value = parseFloat(newnumber);
    return value;
}

我试图四舍五入的数字是 43.65 * 2.5 + 40%,当使用计算器完成时 = 152.775 或在 PHP 中四舍五入 = 152.78。

在 javascript 中,当我执行 console.log 时,数字为 152.774999999998,当使用上述函数四舍五入时,我得到 152.77

非常感谢任何解决此问题的帮助

【问题讨论】:

  • 这就是我们不使用浮点数作为货币的原因。
  • 确保在使用parseInt 时指定一个基数;通常你想以 10 为基数工作,所以:parseInt(yourNumber,10).
  • 有人可以向我解释为什么在 PHP 中 round(22.044960000000003,2) 变成 22.04 和 round(152.77499999999998,2) 变成 152.78 为什么当我只想要 2 dp 时第二个四舍五入到 152.78跨度>

标签: php javascript


【解决方案1】:

这与舍入本身无关,而是与十进制数在基于二进制的硬件中的表示方式有关。

查看floating point guide 了解更多信息以及解决方案/替代方案。

【讨论】:

    【解决方案2】:

    请看How to deal with floating point number precision in JavaScript?

    这是一个例子

    function roundNumber(number, decimals) {
      decimals = parseInt(decimals,10);
      var dec = Math.pow(10,decimals)
      console.log(dec,parseFloat(number)*dec);
      number=""+Math.round(parseFloat(number)*dec+.0000000000001); // fixed the .X99999999999
      return parseFloat(number.slice(0,-1*decimals) + "." + number.slice(-1*decimals))     
    }
    
    
    var val = 43.65 * 2.5;
        val+= val*0.40
    
    console.log(val+' ~= 152.78? --> '+roundNumber(val,2).toFixed(2));
    console.log('15.803 ~= 15.80? --> '+roundNumber(15.803,2).toFixed(2));
    console.log('15.805 ~= 15.81? --> '+roundNumber(15.805,2).toFixed(2));
    console.log('14.803 ~= 14.80? --> '+roundNumber(14.803,2).toFixed(2));
    console.log('0.575 ~=  0.58? --> '+roundNumber(0.575,2).toFixed(2));

    【讨论】:

    • 以 15.803 失败,给出 15.81 而应该给出 15.80
    • 适用于 25.575 (=> 25.58) 但对于 0.575 (=> 0.57) 无效
    【解决方案3】:

    我对此有点思考,并想分享我的解决方案,不要浪费:

    function roundNumber(number, decimals) {      
        var d = parseInt(decimals,10),
            dx = Math.pow(10,d),
            n = parseFloat(number),
            f = Math.round(Math.round(n * dx * 10) / 10) / dx;
        return f.toFixed(d);
    }
    

    这不使用字符串函数,或任何强制向上或向下舍入。

    在这里测试:http://jsfiddle.net/inti/hMrsp/4/

    编辑:已更正,最后减少了零

    【讨论】:

    • var v = 152.79499999999998 失败; - 丢失尾随的 0
    • 谢谢老兄,由于某种原因,这个适用于一切,而 mplungjan 的版本在 14.803 上失败,例如
    【解决方案4】:

    php 舍入到 152.78,因为它看到 152.77499 是 152.775,最后是 152.178。你不能使用 php 的舍入值吗?

    【讨论】:

      【解决方案5】:

      这是因为 JS(浏览器)和 PHP 使用的精度不同,或者实际使用了多少位来存储数字。

      你可以让你的 JS 舍入函数来舍入到第二位 Math.round(floatNumber*100)/100

      【讨论】:

        【解决方案6】:

        在下面找到数字格式的 javascript 函数

        <script type="text/javascript">
        function format_number(pnumber,decimals){
            if (isNaN(pnumber)) { return 0};
            if (pnumber=='') { return 0};
        
            var snum = new String(pnumber);
            var sec = snum.split('.');
            var whole = parseFloat(sec[0]);
            var result = '';
        
            if(sec.length > 1){
                var dec = new String(sec[1]);
                dec = String(parseFloat(sec[1])/Math.pow(10,(dec.length - decimals)));
                dec = String(whole + Math.round(parseFloat(dec))/Math.pow(10,decimals));
                var dot = dec.indexOf('.');
                if(dot == -1){
                    dec += '.';
                    dot = dec.indexOf('.');
                }
                while(dec.length <= dot + decimals) { dec += '0'; }
                result = dec;
            } else{
                var dot;
                var dec = new String(whole);
                dec += '.';
                dot = dec.indexOf('.');
                while(dec.length <= dot + decimals) { dec += '0'; }
                result = dec;
            }   
            return result;
        }
        
        var value = format_number(newnumber,2);
        </script>
        

        【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-06-22
        • 2016-01-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多