Isso funciona para arredondar para N dígitos (se você deseja apenas truncar para N dígitos, remova a chamada Math.round e use a chamada Math.trunc):
function roundN(value, digits) {
var tenToN = 10 ** digits;
return /*Math.trunc*/(Math.round(value * tenToN)) / tenToN;
}
Tive que recorrer a essa lógica em Java no passado, quando eu estava criando componentes E-Slate de manipulação de dados . Isso porque eu descobri que adicionar 0,1 muitas vezes a 0 você acabaria com alguma parte decimal inesperadamente longa (isso se deve à aritmética de ponto flutuante).
Um comentário do usuário em Formato número para sempre mostrar 2 casas decimais chama essa técnica de escalonamento.
Alguns mencionam que há casos que não são arredondados conforme o esperado e em http://www.jacklmoore.com/notes/rounding-in-javascript/ isso é sugerido:
function round(value, decimals) {
return Number(Math.round(value+'e'+decimals)+'e-'+decimals);
}
toFixed()
( developer.mozilla.org/En/Core_JavaScript_1.5_Reference/… ), mas é bugado no IE: stackoverflow.com/questions/661562/… ; você terá que escrever sua própria versão ...