La risposta di Dogbert è buona, ma se il tuo codice potrebbe avere a che fare con numeri negativi, Math.floor
da solo potrebbe dare risultati inaspettati.
Ad esempio Math.floor(4.3) = 4
, maMath.floor(-4.3) = -5
Usa invece una funzione di supporto come questa per ottenere risultati coerenti:
truncateDecimals = function (number) {
return Math[number < 0 ? 'ceil' : 'floor'](number);
};
var a = 5.467;
var truncated = truncateDecimals(a * 100) / 100;
Ecco una versione più conveniente di questa funzione:
truncateDecimals = function (number, digits) {
var multiplier = Math.pow(10, digits),
adjustedNum = number * multiplier,
truncatedNum = Math[adjustedNum < 0 ? 'ceil' : 'floor'](adjustedNum);
return truncatedNum / multiplier;
};
var a = 5.467;
var truncated = truncateDecimals(a, 2);
var b = 4235.24;
var truncated = truncateDecimals(b, -2);
Se questo non è il comportamento desiderato, inserisci una chiamata a Math.abs
nella prima riga:
var multiplier = Math.pow(10, Math.abs(digits)),
EDIT: shendz sottolinea correttamente che l'utilizzo di questa soluzione con a = 17.56
produrrà in modo errato 17.55
. Per ulteriori informazioni sul motivo per cui ciò accade, leggi Quello che ogni informatico dovrebbe sapere sull'aritmetica in virgola mobile . Sfortunatamente, scrivere una soluzione che elimini tutte le fonti di errore in virgola mobile è piuttosto complicato con javascript. In un'altra lingua useresti numeri interi o forse un tipo Decimal, ma con javascript ...
Questa soluzione dovrebbe essere precisa al 100%, ma sarà anche più lenta:
function truncateDecimals (num, digits) {
var numS = num.toString(),
decPos = numS.indexOf('.'),
substrLength = decPos == -1 ? numS.length : 1 + decPos + digits,
trimmedResult = numS.substr(0, substrLength),
finalResult = isNaN(trimmedResult) ? 0 : trimmedResult;
return parseFloat(finalResult);
}
Per coloro che hanno bisogno di velocità ma vogliono anche evitare errori in virgola mobile, prova qualcosa come BigDecimal.js . Puoi trovare altre librerie BigDecimal javascript in questa domanda SO: "Esiste una buona libreria BigDecimal Javascript?" ed ecco un buon post sul blog sulle librerie matematiche per Javascript