Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/276.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript与PHP取整_Php_Javascript - Fatal编程技术网

Javascript与PHP取整

Javascript与PHP取整,php,javascript,Php,Javascript,我对PHP和javascript取整数字的方式有一些问题。我正在使用PHP的round函数和此javascript函数: 函数轮号(数字,小数){ var newnumber=新的数字(数字+“”).toFixed(parseInt(小数)); var值=parseFloat(newnumber); 返回值; } 我尝试四舍五入的数字是43.65*2.5+40%,当使用计算器进行四舍五入时=152.775,或者使用PHP进行四舍五入时=152.78 在javascript中,当我执行conso

我对PHP和javascript取整数字的方式有一些问题。我正在使用PHP的round函数和此javascript函数:

函数轮号(数字,小数){
var newnumber=新的数字(数字+“”).toFixed(parseInt(小数));
var值=parseFloat(newnumber);
返回值;
}
我尝试四舍五入的数字是43.65*2.5+40%,当使用计算器进行四舍五入时=152.775,或者使用PHP进行四舍五入时=152.78

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


非常感谢您对这个问题的任何帮助

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


查看更多关于这方面的信息,以及解决方案/备选方案。

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

请在下面的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>

函数格式\u编号(P编号,小数){
if(isNaN(pnumber)){返回0};
如果(pnumber=''){返回0};
var snum=新字符串(pnumber);
var sec=最小拆分('.');
var整=解析浮点(第[0]节);
var结果=“”;
如果(秒长>1){
var dec=新字符串(第[1]节);
dec=String(parseFloat(第[1]节)/Math.pow(10,(dec.length-decimals));
dec=String(整数+Math.round(parseFloat(dec))/Math.pow(10,小数));
var dot=dec.indexOf('.');
如果(点==-1){
十二月+=';
点=十二月指数('.');
}
而(12月长度请看

这里有一个例子

函数轮号(数字,小数){
小数=parseInt(小数,10);
var dec=数学功率(10,小数)
控制台日志(dec、parseFloat(数字)*dec);
number=”“+Math.round(parseFloat(number)*dec+.0000000000001);//修复了.x99999999
返回parseFloat(number.slice(0,-1*小数)+“+”number.slice(-1*小数))
}
var-val=43.65*2.5;
val+=val*0.40
log(val+'~=152.78?-->'+整数(val,2).toFixed(2));
console.log('15.803~=15.80?-->'+整数(15.803,2).toFixed(2));
console.log('15.805~=15.81?-->'+roundNumber(15.805,2).toFixed(2));
log('14.803~=14.80?-->'+整数(14.803,2).toFixed(2));

console.log('0.575~=0.58?-->'+roundNumber(0.575,2).toFixed(2));
这是因为JS(浏览器)和PHP中使用的精度不同,或者实际上使用了多少位来存储数字

您可以让JS舍入函数这样舍入到第二位
Math.round(floatNumber*100)/100
我对此有点想法,想与大家分享我的解决方案,不要浪费了:

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);
}
这不使用字符串函数,也不使用任何强制向上或向下舍入

在这里测试它:


Edit:已更正,在结尾处减少了零

这就是为什么我们不使用浮点数作为货币。请确保在使用
parseInt
时指定基数;通常您希望以10为基数,因此:
parseInt(yourNumber,10)
。有人能向我解释为什么在PHP回合中使用(22.04496000000003,2)变为22.04和圆形(152.7749999998,2)变为152.78为什么第二个四舍五入到152.78,而我只想要2个dp,这似乎有点过分-我发现它的形式很差,没有归功于你从哪里得到它。在var v=152.7949999998上失败;-失去了尾随的0汉克斯兄弟,出于某种原因,这一个适用于所有东西,而mplungjan的版本在14.803上失败s为15.803,给出了15.81,而对于25.575(>25.58)它应该给出15.80功,但是对于0.575(>0.57)它失败了