Javascript VS PHP rounding


Javascript VS PHP rounding

我在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

任何重新解决此问题的帮助都将不胜感激

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

查看浮点指南,了解更多有关此方面的信息,以及解决方案/替代方案。

请看一下如何在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));

我对此进行了一些思考,并想分享我的解决方案,不要浪费它:

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/

编辑:已更正,在结束时减少了零

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

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

你可以让你的JS取整函数这样做来取整到第二位Math.round(floatNumber*100)/100

在下面查找数字格式的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>