Question

J'ai une fonction d'arrondir un nombre donné à la fonction au pence entier le plus proche.

<script type='text/javascript'>
Math.roundNumber = function(a,b){
    if(!isNaN(parseInt(a))){
        c = Math.pow(10,b);
        return (Math.round(a*c)/c);
    }
    return false;
}
</script>

mais il est venu à mon attention que ledit numéro entré dans la fonction ne doit être arrondi au plus proche pence mais il doit être arrondi à deux décimales.

par exemple.

15.236562213541684 would = 15.24  
9846.65456169846 would = 9846.66

Je pensais que ce serait juste un cas de changement     retour (Math.round ( c) / c); À     retour (Math.ceil (a c) / c);

Il est évident que je me trompais.

Toute aide à ce sujet?

** EDIT **

Voici la formule que je suis en train de réaliser ça va peut-être aider

a = intrest price
b = terms
c = a/b
d = c*(b-1)
e = a-d

par exemple

a = 295.30
b = 156
c = 295.30/156 = 1.90 (rounded up to nearest decimal as above)
d = 1.90 * (b-1) = 294.50
e = 295.30 - 294.50 = 0.80

peut-on droit une fonction pour faire ce qui précède?

est un lien vers le code actuel, je l'ai compris la formule ... sa formule très ancienne que je fait quand j'ai commencé JavaScript (ce qui est tout à l'heure maintenant) mais je ne suis toujours pas mieux maintenant que je l'étais à l'époque.

Quelqu'un peut-il nettoyer pour voir si elles peuvent voir pourquoi sa ne fonctionne pas pour correspondre à la fonction ci-dessus?

Était-ce utile?

La solution

function currency_fix(number)
{
    var unfixed_number = Math.ceil(number.toFixed(5) * 100) / 100;
    return unfixed_number.toFixed(2)
}

var a = currency_fix(295.30)
var b = currency_fix(156)
var c = currency_fix(a / b)
var d = currency_fix(c * (b - 1))
var e = currency_fix(a - d)

document.write(
    'a = ' + a + '<br />' +
    'b = ' + b + '<br />' +
    'c = ' + c + '<br />' +
    'd = ' + d + '<br />' +
    'e = ' + e + '<br />'
)

// OUTPUT
//a = 295.30
//b = 156.00
//c = 1.90
//d = 294.50
//e = 0.80

Je l'ai de donner les résultats que vous voulez dans ce cas. Je ne sais pas si elle va travailler chaque fois, mais il semble. Je serais certainement vérifier cela fonctionne comme vous le souhaitez d'abord.

Autres conseils

Il y a une fonction intégrée pour déjà, Number.toFixed(numDigits) , pourquoi ne pas l'utiliser?

  

Paramètres: chiffres   Le nombre de chiffres après la virgule; cela peut être une valeur comprise entre 0 et 20, inclus, et les mises en œuvre peut éventuellement supporter une plus grande plage de valeurs. Si cet argument est omis, elle est traitée comme 0.

     

retour:   Une représentation de chaîne de nombre qui n'utilise pas la notation exponentielle et a chiffres exactement chiffres après la virgule. Le nombre est arrondi si nécessaire, et la partie décimale est complétée par des zéros si nécessaire pour qu'il ait la longueur spécifiée. Si le nombre est supérieur à 1E + 21, cette méthode appelle simplement Number.toString () et retourne une chaîne en notation exponentielle.

Exemple:

>>> new Number(15.236562213541684).toFixed(2);
"15.24"
>>> new Number(9846.65456169846).toFixed(2);
"9846.65"

Ce dernier ne correspond pas à votre exemple -. 9846.65456169846 arrondi à deux décimales doivent être 9846.65, pas 9846.66

Votre code est plus complexe que ce que vous avez besoin pour cette tâche. Si vous connaissez la virgule représentera toujours une valeur stable quelle que soit la longueur des chiffres de chaque côté de ce point décimal que vous avez de la chance.

1) Ensuite, vous devez simplement votre numéro multiple d'origine par 100

2) si (Numéro (x.charAt (indexOf ( "") + 1))> 4) {x + = 1} où x est votre numéro

3) parseInt

4) diviser par 100 et vous avez terminé.

Conseil à utiliser l'arithmétique point fixe est un bon conseil. Malheureusement, il n'y a pas de calcul à virgule fixe en Javascript - tous les chiffres sont en double précision des nombres à virgule flottante. (Eh bien, pas l'arithmétique en virgule fixe sans tirer dans une bibliothèque de soutien explicite.)

Pour l'entrée de lavage dans les champs de texte, j'ai commencé à traiter les nombres sous forme de chaînes (dans toute la mesure du possible). Hacher l'entrée vers le haut dans les parties situées à gauche et à droite de la virgule, puis travailler dans des valeurs entières (via Math.floor () lorsque cela est nécessaire). Si vous avez à traiter avec des chiffres errants passé la 2ème place décimale, soit les traiter comme une erreur (que signifient-ils de toute façon?), Ou bien, encore une fois, les séparer et de travailler avec eux comme des entiers.

Si vous êtes pas traiter avec des valeurs fournies par l'utilisateur (par exemple, des choses à partir des champs de saisie de texte), alors vous devriez vraiment pas faire cela en Javascript, parce que, encore une fois, vous n » t ont les outils numériques que vous avez vraiment besoin.

Remplacement Math.round() avec Math.ceil() devrait fonctionner. Le bug doit être quelque part ailleurs

En outre, je vous suggère de laisser tomber le isNaN(parseInt()) complètement les fonctions mathématiques chasseront au numéro de toute façon, revenir NaN si ce n'est pas possible. Cela conduira à la fonction de retour NaN aussi bien, ce qui est un meilleur ajustement que false booléenne.

Et BTW: c'est une mauvaise idée d'utiliser les mathématiques à virgule flottante avec des valeurs monétaires: utiliser à la place des points fixes Arithmétique


Maintenant que nous savons ce que vous essayez de faire, voici le code qui calcule les valeurs souhaitées pour votre exemple:

var value = 295.30;
var count = 156;
var payment = Math.ceil(value * 100 / count) / 100;
var last_payment = Math.round((value - (count - 1) * payment) * 100) / 100;

Modification round() à ceil() pour tous les calculs ne fonctionne pas comme le dernier paiement doit être arrondi normalement pour compenser les imprécisions dues à l'utilisation de valeurs à virgule flottante.

Il est généralement préférable de mathématiques ne entier utilisent, donc multiplier toutes les valeurs avec 100 et convertir uniquement lors de la sortie des valeurs:

var value = 29530;
var count = 156;
var payment = Math.ceil(value / count);
// rounding no longer necessary as integer math is precise:
var last_payment = value - (count - 1) * payment;

Non, vous aviez raison.

Je l'ai testé votre code avec la modification de la cellule, et il fonctionne.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top