Kun je een getal in javascript afronden op 1 teken achter de komma (goed afgerond)?
Ik heb de *10, round, /10 geprobeerd, maar er blijven twee decimalen achter aan het einde van de int.
Antwoord 1, autoriteit 100%
Math.round(num * 10) / 10
werkt, hier is een voorbeeld…
var number = 12.3456789
var rounded = Math.round(number * 10) / 10
// rounded is 12.3
als je wilt dat het één cijfer achter de komma heeft, zelfs als dat een 0 zou zijn, voeg dan toe…
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!
EDIT: Ronde toevoegen met precisiefunctie…
Met dit principe als referentie, is hier een handige kleine ronde functie die precisie vereist…
function round(value, precision) {
var multiplier = Math.pow(10, precision || 0);
return Math.round(value * multiplier) / multiplier;
}
… gebruik …
round(12345.6789, 2) // 12345.68
round(12345.6789, 1) // 12345.7
… wordt standaard afgerond op het dichtstbijzijnde gehele getal (precisie 0) …
round(12345.6789) // 12346
… en kan worden gebruikt om af te ronden naar de dichtstbijzijnde 10 of 100 enz…
round(12345.6789, -1) // 12350
round(12345.6789, -2) // 12300
… en correct omgaan met negatieve getallen …
round(-123.45, 1) // -123.4
round(123.45, 1) // 123.5
… en kan worden gecombineerd met toFixed om consistent op te maken als string …
round(456.7, 2).toFixed(2) // "456.70"
Antwoord 2, autoriteit 13%
var number = 123.456;
console.log(number.toFixed(1)); // should round to 123.5
Antwoord 3, autoriteit 4%
Als u Math.round(5.01)
gebruikt, krijgt u 5
in plaats van 5.0
.
Als je toFixed
gebruikt, kom je afrondingproblemen.
Als je het beste van twee werelden wilt, combineer dan de twee:
(Math.round(5.01 * 10) / 10).toFixed(1)
Misschien wil je hiervoor een functie maken:
function roundedToFixed(input, digits){
var rounded = Math.pow(10, digits);
return (Math.round(input * rounded) / rounded).toFixed(digits);
}
Antwoord 4, autoriteit 3%
lodash
heeft een round
methode:
_.round(4.006);
// => 4
_.round(4.006, 2);
// => 4.01
_.round(4060, -2);
// => 4100
Bron.
Antwoord 5
Ik stem voor toFixed()
, maar voor de goede orde, hier is een andere manier die bitverschuiving gebruikt om het getal naar een int te casten. Het rondt dus altijd af naar nul (naar beneden voor positieve getallen, naar boven voor negatieven).
var rounded = ((num * 10) << 0) * 0.1;
Maar goed, aangezien er geen functie-aanroepen zijn, is het erg snel. 🙂
En hier is er een die string-matching gebruikt:
var rounded = (num + '').replace(/(^.*?\d+)(\.\d)?.*/, '$1$2');
Ik raad het gebruik van de tekenreeksvariant niet aan, zeg het maar.
Antwoord 6
Probeer dit:
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
minder ingewikkeld en gemakkelijker te implementeren…
Hiermee kun je een functie maken om te doen:
function RoundAndFix (n, d) {
var m = Math.pow (10, d);
return Math.round (n * m) / m;
}
Antwoord 7
Waarom niet gewoon
let myNumber = 213.27321;
+myNumber.toFixed(1); // => 213.3
- toFixed:
geeft een tekenreeks terug die het gegeven getal vertegenwoordigt met gebruik van vaste-kommanotatie. - Unary plus (+): De unaire plus-operator gaat vooraf aan zijn operand en evalueert naar zijn operand, maar probeert deze om te zetten in een getal, als dat nog niet het geval is.
Antwoord 8
ToPrecision-methode gebruiken:
var a = 1.2345
a.toPrecision(2)
// result "1.2"
Antwoord 9
var num = 34.7654;
num = Math.round(num * 10) / 10;
console.log(num); // Logs: 34.8
Antwoord 10
Om het beste antwoord te voltooien:
var round = function ( number, precision )
{
precision = precision || 0;
return parseFloat( parseFloat( number ).toFixed( precision ) );
}
Het invoerparameternummer mag “niet” altijd een getal zijn, in dit geval bestaat .toFixed niet.
Antwoord 11
ES 6-versie van geaccepteerd antwoord:
function round(value, precision) {
const multiplier = 10 ** (precision || 0);
return Math.round(value * multiplier) / multiplier;
}
Antwoord 12
Over het algemeen wordt decimale afronding gedaan door te schalen: round(num * p) / p
Naïeve implementatie
Als u de volgende functie gebruikt met halve cijfers, krijgt u ofwel de bovenste afgeronde waarde zoals verwacht, of de lagere afgeronde waarde, soms afhankelijk van de invoer.
Deze inconsistency
in afronding kan leiden tot moeilijk te detecteren bugs in de klantcode.
function naiveRound(num, decimalPlaces) {
var p = Math.pow(10, decimalPlaces);
return Math.round(num * p) / p;
}
console.log( naiveRound(1.245, 2) ); // 1.25 correct (rounded as expected)
console.log( naiveRound(1.255, 2) ); // 1.25 incorrect (should be 1.26)
Antwoord 13
Als je methode niet werkt, post dan alsjeblieft je code.
U kunt de afrondingstaak echter als volgt uitvoeren:
var value = Math.round(234.567*100)/100
Zal je 234,56 geven
Ook
var value = Math.round(234.567*10)/10
Zal 234,5 geven
Op deze manier kun je een variabele gebruiken in de plaats van de constante zoals hierboven gebruikt.
Antwoord 14
Kleine hoekfilter als iemand het wil:
angular.module('filters').filter('decimalPlace', function() {
return function(num, precision) {
var multiplier = Math.pow(10, precision || 0);
return Math.round(num * multiplier) / multiplier;
};
});
gebruik als via:
{{model.value| decimalPlace}}
{{model.value| decimalPlace:1}}
{{model.value| decimalPlace:2}}
🙂
Antwoord 15
Dit lijkt betrouwbaar te werken bij alles wat ik erop gooi:
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));
}
Het wordt naar boven afgerond, dus je moet het mogelijk aanpassen aan de gebruikssituatie. Dit zou moeten werken:
console.log(round(10.01, 1)); //outputs 11
console.log(round(10.01, 0.1)); //outputs 10.1
Antwoord 16
Als je de juiste afronding belangrijk vindt, dan:
function roundNumericStrings(str , numOfDecPlacesRequired){
var roundFactor = Math.pow(10, numOfDecPlacesRequired);
return (Math.round(parseFloat(str)*roundFactor)/roundFactor).toString(); }
Anders als je dat niet doet, heb je al een antwoord van eerdere berichten
str.slice(0, -1)
Antwoord 17
Math.round( num * 10) / 10
werkt niet.
Bijvoorbeeld 1455581777.8-145558160.4
geeft u 1310023617.3999999
.
Gebruik dus alleen num.toFixed(1)
Antwoord 18
Ik heb een manier gevonden om de precisieproblemen te vermijden:
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
Antwoord 19
Math.round( mul/count * 10 ) / 10
Math.round(Math.sqrt(sqD/y) * 10 ) / 10
Bedankt
Antwoord 20
function rnd(v,n=2) {
return Math.round((v+Number.EPSILON)*Math.pow(10,n))/Math.pow(10,n)
}
deze past goed bij de hoekkasten
Antwoord 21
Ik heb er een gemaakt die het getaltype retourneert en ook alleen decimalen plaatst als dat nodig is (geen 0 opvulling).
Voorbeelden:
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
De code:
function roundWithMaxPrecision (n, precision) {
let precisionWithPow10 = Math.pow(10, precision);
return Math.round(n * precisionWithPow10) / precisionWithPow10;
}
Antwoord 22
Als je broncode typoscript is, zou je een functie als deze kunnen gebruiken:
public static ToFixedRounded(decimalNumber: number, fractionDigits: number): number {
var rounded = Math.pow(10, fractionDigits);
return (Math.round(decimalNumber * rounded) / rounded).toFixed(fractionDigits) as unknown as number;
}