1
votes

Comment arrondir le nombre décimal en javascript

J'ai ce nombre décimal: 1.12346

Je veux maintenant ne garder que 4 décimales mais je veux arrondir vers le bas pour qu'il renvoie: 1.1234. Maintenant, il renvoie: 1.1235 ce qui est faux.

Effectivement. Je veux les 2 derniers chiffres: "46" arrondis à "4" et non à "5"

Comment est-ce possible?

    var nums = 1.12346;
    nums = MathRound(nums, 4);
    console.log(nums);

function MathRound(num, nrdecimals) {
    return num.toFixed(nrdecimals);
}


4 commentaires

Donc, vous ne voulez pas qu'il s'arrondisse, vous voulez qu'il soit coupé. La seule raison pour laquelle vous feriez cela est de l'afficher sous forme de chaîne, car sinon, tous vos calculs seraient erronés à partir de ce moment-là, alors: est-ce que l'idée que cela devienne une chaîne?


Oui, je veux arrondir à: 1,1234 et non 1,1235 comme c'est le cas maintenant. Je veux le garder sous forme de nombre et non de chaîne. (Vous avez raison, d'une certaine manière, il "couperait" les autres nombres après 4)


Pour éviter un problème XY , que faites-vous qui vous fait penser que vous avez besoin couper les nombres après la 4e décimale?


Le terme «arrondi» n'est pas vraiment précis ici car vous souhaitez toujours conserver une partie fractionnaire. Multipliez par 10000, appelez Math.floor () , puis divisez par 10000. Notez que vous devrez probablement encore appeler .toFixed () car les décimales et le binaire flottant point ne s'entend pas toujours.


5 Réponses :


1
votes

Si vous faites cela parce que vous avez besoin d'imprimer / afficher une valeur, nous n'avons pas besoin de rester dans le pays des nombres: transformez-le en chaîne et découpez-le:

let nums = 1.12346;

// take advantage of the fact that
// bit operations cause 32 bit integer conversion
let intPart = (nums|0); 

// then get a number that is _always_ 0.something:
let fraction = nums - intPart ;

// and just cut that off at the known distance.
let chopped = `${fraction}`.substring(2,6);

// then put the integer part back in front.
let finalString = `${intpart}.${chopped}`;

Bien sûr, si vous ne faites pas cela pour la présentation, la question "pourquoi pensez-vous que vous devez faire cela" (car cela invalide les calculs ultérieurs impliquant ce nombre) devrait probablement recevoir une réponse Premièrement, parce que vous aider à faire la mauvaise chose n’aide pas réellement, mais aggrave les choses.


4 commentaires

En fait, j'aurai besoin du nombre sous forme de nombre et non de chaîne, mais il doit être au format 4 décimales et arrondi vers le bas pour une raison d'être accepté par une certaine fonction et être inférieur à 1,12346 donc 4 décimales et ce critère sera alors être 1,1234. Mais cela semble fonctionner aussi pour le couper comme ça.


bien sûr, cela fonctionnera, mais ne le faites pas. Faites ce que @caseyjhol a montré. Multipliez votre nombre par 10000, solez-le, puis divisez-le à nouveau par 10000.


Oui, j'essaye en fait d'aller avec la solution @Bibberty qui semble fonctionner aussi?


Ils fonctionnent tous les deux, mais "times, floor, div" simplifie les choses et garde les bizarreries que vous pourriez rencontrer (grâce à l'arrondi des flotteurs IEEE) plus évidentes.



1
votes

C'est la même question que Comment arrondir le chiffre 2 décimal lieux? . Il vous suffit de faire les ajustements pour les décimales supplémentaires.

function MathRound (number, digits) {
  var adjust = Math.pow(10, digits); // or 10 ** digits if you don't need to target IE
  return Math.floor(number * adjust) / adjust;
}

console.log(MathRound(1.12346, 4));

console.log(Math.floor(1.12346 * 10000) / 10000);

Si vous voulez que cela soit une fonction réutilisable, vous pouvez faire:

Math.floor(1.12346 * 10000) / 10000


5 commentaires

pas besoin de Math.pow dans le JS moderne, il suffit d'utiliser 10 ** chiffres


@ Mike'Pomax'Kamermans Bon appel, mais cela ne fonctionne pas dans Internet Explorer. J'ajouterai cependant un commentaire.


Comme je l'ai dit: JS moderne. Internet Explorer n'a qu'une seule version prise en charge, et même celle-ci est considérée comme héritée par la société qui le fabrique, avec un navigateur moderne créé par la même société qui le remplace dans tous les systèmes d'exploitation toujours pris en charge par cette même société. Donc: à moins que cela ne soit explicitement spécifié qu'il doit fonctionner dans IE, mieux vaut ignorer que IE existe même toujours en 2019 à l'avenir.


Normalement, je suis d'accord, mais dans un cas comme celui-ci où il n'est que légèrement plus difficile à taper et a des performances similaires, je suis enclin à utiliser du code qui fonctionne dans tous les navigateurs (d'autant plus que, selon l'endroit où vous regardez, IE est toujours le 2e ou 3e navigateur de bureau le plus utilisé).


C'est suffisant. Je suis plutôt du genre "Aider activement le monde à oublier que IE existe même en enseignant seulement l'inclinaison JS moderne", mais c'est un argument raisonnable.



1
votes

Je pense que cela fera l'affaire. Corriger essentiellement l'arrondi.

var nums = 1.12346;
    nums = MathRound(nums, 4);
    console.log(nums);

function MathRound(num, nrdecimals) {
    let n = num.toFixed(nrdecimals);
    return (n > num) ? n-(1/(Math.pow(10,nrdecimals))) : n;
}


1 commentaires

Oui, cela semble faire l'affaire et c'est bien de tout garder en chiffres comme ça. Merci!



0
votes

var nums = 1.12346;
var dec = 10E3;
var intnums = Math.floor(nums * dec);
var trim = intnums / dec;
console.log(trim);


0 commentaires

0
votes
var num = 1.2323232;
converted_num = num.toFixed(2);  //upto 2 precision points
o/p : "1.23"

To get the float num : 
converted_num = parseFloat(num.toFixed(2));
o/p : 1.23

0 commentaires