2015-05-07 4 views
9

Dieser JavaScript-Code liefert 115,3:Warum gibt diese mathematische Funktion in Java und JavaScript unterschiedliche Werte zurück?

function FV(rate, nper, pmt, pv, type) { 
 
    var pow = Math.pow(1 + rate, nper); 
 
    var fv; 
 
    if (rate) { 
 
     fv = (pmt*(1+rate*type)*(1-pow)/rate)-pv*pow; 
 
    } else { 
 
     fv = -1 * (pv + pmt * nper); 
 
    } 
 
    return fv.toFixed(2); 
 
} 
 

 
document.write( FV(0.06/12,12,-(2750+1375)/12,-0,0)-(0+2750+1375) )

Diese Java-Code gibt 106,1:

public double FV(double rate, double nper, double pmt, double pv, int type) { 
    double pow = Math.pow(1 + rate, nper); 
    double fv;   
    if (rate > 0) { 
     fv = (pmt*(1+rate*type)*(1-pow)/rate)-pv*pow; 
    } else { 
     fv = -1 * (pv + pmt * nper); 
    } 
    return fv; 
} 
System.out.println(FV(0.06/12,12,-(2750+1375)/12,-0,0)-(0+2750+1375)); 

Sie sehen gleich zu mir, aber sie kehren unterschiedliche Werte. Was ist los mit dir?

+3

Der Standardtyp der Java-'Integer'-Literale' int' und int devision runden den Wert ab. während in Javascript devision operator Rückgabewert dynamisch, z. '1/2 // gibt 0.5 in JavaScript zurück und' 1/2 // gibt in Java 0 zurück –

+1

@SubhrajyotiMajumder Ganzzahlige Division rundet auf Null ab. Die [JLS] (http://docs.oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.17.2) sagt das dazu: 'Ganzzahlige Division läuft auf 0. Das ist, ist der Quotient, der für die Operanden n und d erzeugt wird, die nach binärer numerischer Heraufstufung ganze Zahlen sind (§5.6.2), ein ganzzahliger Wert q, dessen Größe so groß wie möglich ist, während | d · q | ≤ | n |. Außerdem ist q positiv, wenn | n | ≥ | d | und n und d haben das gleiche Vorzeichen, aber q ist negativ, wenn | n | ≥ | d | und n und d haben entgegengesetzte Vorzeichen. – mkobit

+0

Ich sage das gleiche @ kobit –

Antwort

26

In JavaScript -(2750+1375)/12 wertet -343.75 aus. In Java wird -343 ausgewertet, da in Java bei der Division von Integer-Zahlen ganzzahliges Ergebnis erhalten wird. Um dies zu beheben, ersetzen Sie den Ausdruck einfach durch -(2750+1375)/12.0.

Verwandte Themen