Javascript与PHP取整
我对PHP和javascript取整数字的方式有一些问题。我正在使用PHP的round函数和此javascript函数: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
函数轮号(数字,小数){
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)它失败了