Frage

Ich habe eine Funktion, um eine Zahl gegeben, um die Funktion auf die nächste ganze pence.

<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>

aber es ist mir zu Ohren gekommen, dass die besagten Nummer eingegeben, die in die Funktion muss nur aufgerundet auf die nächste pence aber es muss auf zwei Dezimalstellen gerundet.

E. G.

15.236562213541684 would = 15.24  
9846.65456169846 would = 9846.66

Ich dachte es wäre nur ein Fall von ändern return (Math.Runde(c)/c);Zu return (Math.ceil(ac)/c);

Natürlich war ich sehr falsch.

Jede Hilfe in dieser Angelegenheit?

** EDIT **

Hier ist die Formel, die ich versuche zu erreichen, vielleicht wird das helfen

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

so zum Beispiel

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

kann irgendjemand eine Funktion zu machen die oben?

Hier ein link zu den aktuellen code, den ich habe, darunter auch die Formel...es ist eine sehr alte Formel, die ich machte, als ich anfing, JavaScript (das ist mittlerweile eine ganze Weile her) aber ich bin immer noch nicht besser jetzt, als ich damals war.

Jeder kann es sauber, um zu sehen, wenn Sie sehen, warum die nicht arbeiten, entsprechend der obigen Funktion?

War es hilfreich?

Lösung

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

Ich habe es die Ergebnisse, die Sie in diesem Fall möchten. Nicht sicher, ob es wird jedes Mal arbeiten, aber es scheint. Ich würde auf jeden Fall überprüfen, es funktioniert, wie Sie es wollen zuerst.

Andere Tipps

Es gibt eine eingebaute Funktion für diese schon, Number.toFixed(numDigits) , warum dies nicht benutzen?

  

Parameter: Ziffern
  Die Anzahl der Stellen nach dem Komma zu erscheinen; Dies kann ein Wert zwischen 0 und 20 einschließlich ist, und gegebenenfalls einen größeren Implementierungen Wertebereich unterstützen. Wenn dieses Argument weggelassen wird, wird es als 0 behandelt.

     

Returns:
  Eine String-Darstellung Zahl, die nicht Exponentialnotation nicht verwendet und hat genau Ziffern Ziffern nach dem Komma. Die Nummer wird ggf. abgerundet, und der Bruchteil wird mit Nullen aufgefüllt, falls erforderlich, so dass es die spezifizierte Länge aufweist. Wenn Zahl größer als 1e + 21, ist diese Methode ruft einfach Number.toString () und gibt einen String in Exponentialschreibweise.

Beispiel:

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

Die letzte habe Ihr Beispiel nicht überein -. 9846.65456169846 auf zwei Dezimalstellen gerundet sollte 9846.65 werden, nicht 9846.66

Der Code ist komplexer als das, was Sie für diese Aufgabe benötigen. Wenn Sie das Komma wissen immer einen stabilen Wert unabhängig von der Länge der Stellen auf beiden Seiten dieser Dezimalpunkt vertreten wird, sind Sie im Glück.

1) Dann müssen Sie nur mehrere der ursprünglichen Zahl von 100

2) if (Anzahl (x.charAt (indexOf ( "") + 1))> 4) {x + = 1}, wobei x Ihre Zahl

3) parseInt

4) Division durch 100 und Sie sind fertig.

Beratung zu verwenden, fixed-point Arithmetik ist guter Rat teuer.Leider gibt es keine fixed-point arithmetic in Javascript sind alle zahlen double-precision floating-point numbers.(Naja, kein fixed-point-Arithmetik ohne ziehen in einigen explizite support-Bibliothek.)

Für die Reinigung Eingaben in Textfeldern, die ich angefangen habe, den Umgang mit den zahlen als strings (so gut wie möglich).Hacken Sie den Eingang bis in die Gegend Links und rechts vom Dezimalpunkt, dann arbeiten Sie in integer-Werte (über Mathematik.floor (), wenn notwendig).Wenn Sie haben zu deal mit streunenden Ziffern hinter der 2. Dezimalstelle, entweder behandeln Sie als einen Fehler (was bedeuten Sie überhaupt?) oder sonst, wieder, teilen Sie Sie aus und arbeiten mit Ihnen als ganze zahlen.

Wenn Sie nicht Umgang mit Nutzer-generierten Werte (d.h., Sachen von text-Eingabe-Felder), dann sollten Sie wirklich nicht tun, werden diese in Javascript, weil Sie nicht über die numerischen Werkzeuge, die Sie wirklich brauchen.

Ersetzen Math.round() mit Math.ceil() sollte funktionieren. Der Fehler muss woanders sein

Auch ich schlage vor, Fallenlassen der isNaN(parseInt()) vollständig, da die mathematischen Funktionen ohnehin Zahl geworfen wird, Rückkehr NaN wenn das nicht möglich ist. Dies wird auf die Funktion führen NaN Rückkehr als auch, was eine bessere Passform als boolean false ist.

Und btw: es ist eine schlechte Idee Gleitkommamathematik mit Geldwert zu verwenden: Statt festen Punkt arithmetics verwenden

!

Jetzt, da wir wissen, was Sie versuchen, zu tun, hier ist der Code, der die gewünschten Werte für Ihr Beispiel berechnet:

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;

Ändern round() ceil() für alle Berechnungen nicht funktioniert wie die letzte Zahlung gerundet werden muss normalerweise die Ungenauigkeiten zu kompensieren aufgrund mit Gleitkommazahlen.

Es ist im Allgemeinen besser, nur Verwendung integer Mathematik, so multiplizieren alle Werte mit 100 und wandelt nur dann, wenn die Werte ausgibt:

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;

Nein, Sie haben Recht.

I getestet Ihren Code mit der Zellmodifikation, und es funktioniert.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top