2015-05-07 16 views
9

Ten kod JavaScript zwraca 115,3:Dlaczego ta funkcja matematyczna zwraca różne wartości w Javie i JavaScript?

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

Ten kod Java zwraca 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)); 

one wyglądać tak samo do mnie, ale oni zwracać różne wartości. Co jest nie tak?

+3

Domyślny typ literałów Java 'integer'' int' i int devision podsumowują wartość. mając na uwadze, że w javascript operator zwraca wartość dynamicznie, np. '1/2 // zwraca 0,5 w JavaScript' i' 1/2 // zwraca 0 w Javie' –

+1

@SubhrajyotiMajumder Liczba całkowita zaokrągla w kierunku zera. [JLS] (http://docs.oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.17.2) mówi o tym: 'Podział całkowity zaokrągla w kierunku 0. To jest ilorazem dla operandów nib, które są liczbami całkowitymi po binarnej numerycznej promocji (§ 5.6.2) jest wartością całkowitą q, której wielkość jest tak duża, jak to możliwe, przy jednoczesnym spełnieniu | d · q | ≤ | n |. Ponadto q jest dodatnie, gdy | n | ≥ | d | i n i d mają ten sam znak, ale q jest ujemny, gdy | n | ≥ | d | n i d mają przeciwne znaki. " – mkobit

+0

Mówię to samo @kobit –

Odpowiedz

26

W JavaScript -(2750+1375)/12 ocenia się na -343.75. W Javie wartość ta wynosi -343, ponieważ w Javie, gdy dzielisz liczby całkowite, otrzymujesz wynik całkowity. Aby to naprawić, po prostu zamień wyrażenie na -(2750+1375)/12.0.

Powiązane problemy