var e = 79892.805; alert(e.toFixed(2));Думаете увидите 79892.81? Конечно все зависит от браузера, и может быть где-то что-то работает нормально.
Строго говоря проблема собственно не в округлении, а связана с хранением дробных чисел. Очень часто js почему-то решает что 0.99999999 эвивалентно 1. Хотя при сравнении ошибка тут же обнаруживается, т.е. 0.99999999 != 1.
Для решения своих мелких и не очень задач накидал функцию округления. Ниже приведен код с тестированием с помощью php:
<html>
<head>
</head>
<script type="text/javascript">
function roundTo (num, count) {
var count = typeof count !== 'undefined' ? count : 2;
var s = String(num);
var e = s.indexOf('.');
if( e == -1 )
return num;
var c = s.length - e - 1;
if( c < count ) count = c;
var e1 = e + 1 + count;
var d = Number(s.substr(0,e) + s.substr(e+1, count));
if( s[e1] > 4 ){
d += 1;
}
d /= Math.pow(10, count);
return d;
}
function roundTo_test(n, m, c){
if(Number(roundTo(n,c)) != m){
document.write(n + ' ' + roundTo(n,c) + ' != ' + m + '<br>');
errors++;
}
tests++;
}
var tests = 0;
var errors = 0;
<?php
for($i=0; $i<10000; $i++){
$n = rand(0, 9999999999) / 1000;
$c = rand(0, 4);
$m = round($n, 2);
echo "roundTo_test({$n},{$m}, {$c});";
//echo "if((Math.round({$n}*100)/100) != {$m}){ document.write('{$n} ' + (Math.round({$n}*100)/100) + ' != {$m}<br>'); errors++;}\n";
}
?>
document.write(tests + ' tests <br>' + errors + ' errors<br>');
</script>
<body>
<?php
?>
</body>
</html>
В тесте так же закоментирована строчка по тестированию функции round - можно убедится что ошибок допускает она не мало.
Для удобства можно функцию определить в прототип числа:
Number.prototype.roundTo = function( digitsCount ){
var digitsCount = typeof digitsCount !== 'undefined' ? digitsCount : 2;
var s = String(this);
var e = s.indexOf('.');
if( e == -1 ) return this;
var c = s.length - e - 1;
if( c < digitsCount ) digitsCount = c;
var e1 = e + 1 + digitsCount;
var d = Number(s.substr(0,e) + s.substr(e+1, digitsCount));
if( s[e1] > 4 ) d += 1;
d /= Math.pow(10, digitsCount);
return d;
}
Math.roundTo = function( number ,digitsCount){
number = Number(number);
return number.roundTo(digitsCount);
}