Javascript VS PHP округление

У меня возникают некоторые проблемы с тем, как PHP и Javascript круглые числа. Я использую круглую функцию PHP и эту функцию 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 сделать это, чтобы округлить до 2-й цифры 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>