У меня собственно говоря похожая задача стоит и похожая проблема (я практически не знаю JavaScript).
Есть табличка с числами, при выполнении команды функция выполняет преобразования со всеми численными полями таблицы (умножение или деление).
Так вот проблема заключается в том, что у нас пересчет происходит не совсем верно, при пересчете туда - и обратно получаем разницу на выходе. Я понимаю, что это связано с проблемой округления (но шеф четко ставит задача округления до целочисленного значения, ну в крайнем случае - 2 символа после запятой).
Теоретически подумав я решил, что неплохо было бы при выполнении преобразования сохранять изначальное значение в какую-нибудь временнную переменную, а при обратном действии не выполнять математическую операцию, а возвращать значение из временной переменной.
Примеры функции вот:
1. Прямое преобразование
function exchange_currency_ru(_curs) {
if(now_c == _curs){
} else {
exchange_currency_back_ru(now_c);
$('#mtable').each(function(){
var $table = $(this);
$table.find('td').each(function(){
var $td = $(this).text();
if(Math.abs($td)){
$td = parseInt($td);
if(_curs == 'grn'){
eval($td /= <?php print $ru_currenci_grn ?>);
}
if(_curs == 'usd'){
eval($td /= <?php print $ru_currenci_usd ?>);
}
if(_curs == 'eur'){
eval($td /= <?php print $ru_currenci_eur ?>);
}
$td = $td.toFixed(2);
$(this).text($td);
}
})
});
}
now_c = _curs;
}
2. Обратное преобразование
function exchange_currency_back_ru(_curs){
$('#mtable').each(function(){
var $table = $(this);
$table.find('td').each(function(){
var $td = $(this).text();
if(Math.abs($td)){
$td = parseInt($td);
if(_curs == 'grn'){
eval($td *= <?php print $ru_currenci_grn ?>);
}
if(_curs == 'usd'){
eval($td *= <?php print $ru_currenci_usd ?>);
}
if(_curs == 'eur'){
eval($td *= <?php print $ru_currenci_eur ?>);
}
$td = $td.toFixed(2);
$(this).text($td);
}
})
});
}