Puoi arrotondare un numero in javascript a 1 carattere dopo il punto decimale (arrotondato correttamente)?
Ho provato * 10, round, / 10 ma lascia due decimali alla fine dell'int.
Puoi arrotondare un numero in javascript a 1 carattere dopo il punto decimale (arrotondato correttamente)?
Ho provato * 10, round, / 10 ma lascia due decimali alla fine dell'int.
Risposte:
Math.round(num * 10) / 10
funziona, ecco un esempio ...
var number = 12.3456789
var rounded = Math.round(number * 10) / 10
// rounded is 12.3
se vuoi che abbia un decimale, anche quando sarebbe uno 0, quindi aggiungi ...
var fixed = rounded.toFixed(1)
// fixed is always to 1 d.p.
// NOTE: .toFixed() returns a string!
// To convert back to number format
parseFloat(number.toFixed(2))
// 12.34
// but that will not retain any trailing zeros
// So, just make sure it is the last step before output,
// and use a number format during calculations!
Usando questo principio, per riferimento, ecco una pratica piccola funzione rotonda che richiede precisione ...
function round(value, precision) {
var multiplier = Math.pow(10, precision || 0);
return Math.round(value * multiplier) / multiplier;
}
... utilizzo ...
round(12345.6789, 2) // 12345.68
round(12345.6789, 1) // 12345.7
... il valore predefinito è arrotondato al numero intero più vicino (precisione 0) ...
round(12345.6789) // 12346
... e può essere utilizzato per arrotondare ai 10 o 100 più vicini ecc ...
round(12345.6789, -1) // 12350
round(12345.6789, -2) // 12300
... e corretta gestione dei numeri negativi ...
round(-123.45, 1) // -123.4
round(123.45, 1) // 123.5
... e può essere combinato con toFixed per formattare coerentemente come stringa ...
round(456.7, 2).toFixed(2) // "456.70"
.toFixed()
quando restituisce una stringa quando si desidera un numero.
parseFloat
rimuoverà i decimali lasciati .toFixed()
se è un numero intero (zeri). In generale, se vuoi fare i calcoli, è meglio seguire il tuo primo esempio. Se si desidera visualizzare un numero nell'interfaccia utente, utilizzare .toFixed()
.
.toFixed()
poiché potrebbe restituire risultati di arrotondamento diversi per browser diversi. Leggi questo post per i dettagli sull'argomento!
var number = 123.456;
console.log(number.toFixed(1)); // should round to 123.5
toFixed()
ha problemi - l'ho visto in un browser Chrome in cui chiamo toFixed()
, quindi converto in una stringa e mostra qualcosa di simile 10.00000000068
- strano. Tuttavia, non è possibile riprodurlo in modo affidabile.
.toFixed()
come restituisce un String
quando forse vuoi unNumber
Se usi Math.round(5.01)
, otterrai 5
invece di 5.0
.
Se lo usi toFixed
ti imbatti in problemi di arrotondamento .
Se vuoi il meglio di entrambi i mondi, combina i due:
(Math.round(5.01 * 10) / 10).toFixed(1)
Potresti voler creare una funzione per questo:
function roundedToFixed(_float, _digits){
var rounded = Math.pow(10, _digits);
return (Math.round(_float * rounded) / rounded).toFixed(_digits);
}
Io voto per toFixed()
, ma, per la cronaca, ecco un altro modo che usa il bit shifting per lanciare il numero su un int. Quindi, si arrotonda sempre verso lo zero (in basso per i numeri positivi, in alto per i negativi).
var rounded = ((num * 10) << 0) * 0.1;
Ma ehi, dal momento che non ci sono chiamate di funzione, è veloce. :)
Ed eccone uno che usa la corrispondenza delle stringhe:
var rounded = (num + '').replace(/(^.*?\d+)(\.\d)?.*/, '$1$2');
Non consiglio di usare la variante di stringa, basta dire.
Prova con questo:
var original=28.453
// 1.- round "original" to two decimals
var result = Math.round (original * 100) / 100 //returns 28.45
// 2.- round "original" to 1 decimal
var result = Math.round (original * 10) / 10 //returns 28.5
// 3.- round 8.111111 to 3 decimals
var result = Math.round (8.111111 * 1000) / 1000 //returns 8.111
meno complicato e più facile da implementare ...
con questo, puoi creare una funzione per fare:
function RoundAndFix (n, d) {
var m = Math.pow (10, d);
return Math.round (n * m) / m;
}
EDIT : vedi questo Come arrotondare usando ROUND HALF UP. Modalità di arrotondamento che la maggior parte di noi ha insegnato alle elementari
Perché non solo
let myNumber = 213.27321;
+myNumber.toFixed(1); // => 213.3
var num = 34.7654;
num = Math.round(num * 10) / 10;
console.log(num); // Logs: 34.8
Versione ES 6 della risposta accettata:
function round(value, precision) {
const multiplier = 10 ** (precision || 0);
return Math.round(value * multiplier) / multiplier;
}
Utilizzando il metodo toPrecision:
var a = 1.2345
a.toPrecision(2)
// result "1.2"
12.345.toPrecision( 2 )
è "12"
.
Se il tuo metodo non funziona, per favore pubblica il tuo codice.
Tuttavia, è possibile eseguire l'attività di arrotondamento come:
var value = Math.round(234.567*100)/100
Ti darà 234,56
allo stesso modo
var value = Math.round(234.567*10)/10
Darà 234,5
In questo modo è possibile utilizzare una variabile al posto della costante utilizzata in precedenza.
Piccolo filtro angolare se qualcuno lo vuole:
angular.module('filters').filter('decimalPlace', function() {
return function(num, precision) {
var multiplier = Math.pow(10, precision || 0);
return Math.round(num * multiplier) / multiplier;
};
});
utilizzare se tramite:
{{model.value| decimalPlace}}
{{model.value| decimalPlace:1}}
{{model.value| decimalPlace:2}}
:)
In generale, l'arrotondamento viene eseguito ridimensionando: round(num / p) * p
L'uso della notazione esponenziale gestisce correttamente l'arrotondamento di + ve numeri, Tuttavia, questo metodo non riesce a arrotondare correttamente i casi limite.
function round(num, precision = 2) {
var scaled = Math.round(num + "e" + precision);
return Number(scaled + "e" + -precision);
}
// testing some edge cases
console.log( round(1.005, 2) ); // 1.01 correct
console.log( round(2.175, 2) ); // 2.18 correct
console.log( round(5.015, 2) ); // 5.02 correct
console.log( round(-1.005, 2) ); // -1 wrong
console.log( round(-2.175, 2) ); // -2.17 wrong
console.log( round(-5.015, 2) ); // -5.01 wrong
Anche qui è una funzione che ho scritto per eseguire arrotondamenti aritmetici, puoi testarlo tu stesso.
/**
* MidpointRounding away from zero ('arithmetic' rounding)
* Uses a half-epsilon for correction. (This offsets IEEE-754
* half-to-even rounding that was applied at the edge cases).
*/
function RoundCorrect(num, precision = 2) {
// half epsilon to correct edge cases.
var c = 0.5 * Number.EPSILON * num;
// var p = Math.pow(10, precision); //slow
var p = 1; while (precision--> 0) p *= 10;
if (num < 0)
p *= -1;
return Math.round((num + c) * p) / p;
}
// testing some edge cases
console.log(RoundCorrect(1.005, 2)); // 1.01 correct
console.log(RoundCorrect(2.175, 2)); // 2.18 correct
console.log(RoundCorrect(5.015, 2)); // 5.02 correct
console.log(RoundCorrect(-1.005, 2)); // -1.01 correct
console.log(RoundCorrect(-2.175, 2)); // -2.18 correct
console.log(RoundCorrect(-5.015, 2)); // -5.02 correct
Questo sembra funzionare in modo affidabile su tutto ciò che lancio:
function round(val, multiplesOf) {
var s = 1 / multiplesOf;
var res = Math.ceil(val*s)/s;
res = res < val ? res + multiplesOf: res;
var afterZero = multiplesOf.toString().split(".")[1];
return parseFloat(res.toFixed(afterZero ? afterZero.length : 0));
}
Arrotonda per eccesso, quindi potrebbe essere necessario modificarlo in base al caso d'uso. Questo dovrebbe funzionare:
console.log(round(10.01, 1)); //outputs 11
console.log(round(10.01, 0.1)); //outputs 10.1
Se ti interessa un corretto arrotondamento, allora:
function roundNumericStrings(str , numOfDecPlacesRequired){
var roundFactor = Math.pow(10, numOfDecPlacesRequired);
return (Math.round(parseFloat(str)*roundFactor)/roundFactor).toString(); }
Altrimenti, in caso contrario, hai già una risposta dai post precedenti
str.slice(0, -1)
Ne ho creato uno che restituisce il tipo di numero e posiziona anche i decimali solo se sono necessari (nessuna imbottitura 0).
Esempi:
roundWithMaxPrecision(11.234, 2); //11.23
roundWithMaxPrecision(11.234, 1); //11.2
roundWithMaxPrecision(11.234, 4); //11.23
roundWithMaxPrecision(11.234, -1); //10
roundWithMaxPrecision(4.2, 2); //4.2
roundWithMaxPrecision(4.88, 1); //4.9
Il codice:
function roundWithMaxPrecision (n, precision) {
return Math.round(n * Math.pow(10, precision)) / Math.pow(10, precision);
}
Ho trovato un modo per evitare i problemi di precisione:
function badRound (num, precision) {
const x = 10 ** precision;
return Math.round(num * x) / x
}
// badRound(1.005, 2) --> 1
function round (num, precision) {
const x = 10 ** (precision + 1);
const y = 10 ** precision;
return Math.round(Math.round(num * x) / 10) / y
}
// round(1.005, 2) --> 1.01
Math.round(n * 10) / 10
funziona. Qual è il tuo codice?