Domanda

Ho una funzione per arrotondare un numero dato alla funzione per tutto il penny più vicino.

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

Tuttavia si è giunti alla mia attenzione che il detto numero immesso nella funzione deve essere arrotondato solo fino al più vicino pence tuttavia deve essere arrotondato alla seconda cifra decimale.

per es.

15.236562213541684 would = 15.24  
9846.65456169846 would = 9846.66

Ho pensato che sarebbe solo un caso di cambiamento     ritorno (Math.round ( c) / c); Per     ritorno (Math.ceil (a c) / c);

Ovviamente ero molto sbagliato.

Qualsiasi aiuto su questa materia?

** EDIT **

Questa è la formula che sto cercando di realizzare forse vi aiuterà

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

Così, per esempio

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

qualcuno può giusto una funzione per fare quanto sopra?

Qui è un link al codice corrente ho compreso la formula ... la sua una formula molto vecchio che ho fatto quando ho iniziato JavaScript (che è qualche tempo fa ora), tuttavia sono ancora meglio ora come ho di nuovo ero allora.

Qualcuno può ripulirlo per vedere se riescono a capire perché non il suo lavoro per abbinare la funzione di cui sopra?

È stato utile?

Soluzione

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

ho preso per dare i risultati desiderati in questo caso. Non sono sicuro se sta andando a lavorare ogni volta ma sembra. Mi piacerebbe sicuramente check funziona come si desidera prima.

Altri suggerimenti

C'è una funzione built-in per questo già, Number.toFixed(numDigits) , perché non utilizzare questo?

  

parametro: cifre
  Il numero di cifre a comparire dopo il punto; questo può essere un valore tra 0 e 20, inclusi, e implementazioni può opzionalmente supportare una gamma più ampia di valori. Se questo argomento viene omesso, viene trattato come 0.

     

Returns:
  Una rappresentazione stringa di numero che non utilizza la notazione esponenziale e presenta cifre esattamente cifre dopo il punto decimale. Il numero è arrotondato, se necessario, e la parte frazionaria viene riempito con zeri se necessario in modo che abbia la lunghezza specificata. Se il numero è maggiore di 1e + 21, questo metodo richiede semplicemente Number.toString () e restituisce una stringa nella notazione esponenziale.

Esempio:

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

Quest'ultimo non corrisponde il tuo esempio -. 9846.65456169846 arrotondato a due cifre decimali dovrebbero essere 9846.65, non 9846.66

Il codice è più complesso di quello che vi serve per questo compito. Se si conosce il punto decimale sarà sempre rappresentare un valore stabile, a prescindere dalla durata di cifre su entrambi i lati di quel punto decimale siete fortunati.

1) allora si deve semplicemente multipla numero originale 100

2) se (Number (x.charAt (indexOf ( "") + 1))> 4) {x + = 1} dove x è il numero

3) parseInt

4) dividere per 100 e si è fatto.

Consigli per utilizzare aritmetica a virgola fissa è un buon consiglio. Purtroppo, non v'è alcun aritmetica a virgola fissa in Javascript - tutti i numeri sono numeri in virgola mobile a doppia precisione. (Be ', no aritmetica a virgola fissa senza tirare in qualche libreria di supporto esplicito.)

Per lavare ingresso nei campi di testo, ho iniziato che fare con i numeri come stringhe (in qualunque misura possibile). Tritare l'ingresso su nelle parti a sinistra ea destra del punto decimale, quindi lavorare a valori interi (via Math.floor () quando necessario). Se hai a che fare con le cifre randagi oltre la seconda cifra decimale, o li trattano come un errore (cosa significano comunque?) Oppure, ancora una volta, li scisse e lavorare con loro come numeri interi.

Se sei non che fare con i valori forniti dall'utente (vale a dire, roba da campi di input di testo), allora davvero non dovrebbe essere facendo questo in Javascript, perché, ancora una volta, si don' t hanno gli strumenti numerici si ha realmente bisogno.

La sostituzione Math.round() con Math.ceil() dovrebbe funzionare:. Il bug deve essere da qualche altra parte

Inoltre, vi suggerisco di far cadere il isNaN(parseInt()) completamente le funzioni matematiche getteranno al numero in ogni caso, NaN rinvio se questo non è possibile. Ciò porterà alla funzione che restituisce NaN pure, che è una misura migliore di false booleana.

E btw: è una cattiva idea quella di utilizzare matematiche in virgola mobile con i valori monetari: usa aritmetica a virgola fissa invece

!

Ora che sappiamo quello che stai cercando di fare, ecco il codice che calcola i valori desiderati per il tuo esempio:

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;

Modifica round() a ceil() per tutti i calcoli non funziona come ultimo pagamento deve essere arrotondato normalmente per compensare le imprecisioni dovute all'uso dei valori in virgola mobile.

E 'generalmente meglio solo la matematica uso intero, in modo da moltiplicare tutti i valori con 100 e convertire solo quando si inviano i valori:

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;

No, avevi ragione.

Ho provato il codice con la modifica delle cellule, e funziona.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top