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