2016-04-03 10 views
2

Ok, ich bin kein Programmierer, ich habe keine Schule, aber ... Ich kann nicht herausfinden, warum diese kleine Operation einen NaN-Wert liefert!Javascript gibt einen NaN-Wert nach einer mathematischen Operation zurück

Ich habe diese var am Anfang

// Varialbes for simulation purpose 
var Simulation = false; 
var FakeCapital = 0; 
var PercentOfTotal = 100; 

// Variables 
var Capital = (engine.getBalance()/100).toFixed(2); 
var UsableBalance = Math.floor(PercentOfTotal/100 * Capital); 
var StartingBalance = UsableBalance; 

if (FakeCapital > 0 && Simulation) { 
    Capital = FakeCapital; 
    UsableBalance = Math.floor(PercentOfTotal/100 * Capital); 
    StartingBalance = UsableBalance; 
} 

Also, wenn ich die similation var aktivieren und wenn ich ein anderes Kapital verwenden möchten, verwenden Sie das Skript das fakecapital mein Skript zu testen.

Hier werden alle Arbeiten, aber ich denke, dass hier das Problem, speziell die UsableBalance = Math.floor(PercentOfTotal/100 * Capital);

Denn wenn das Skript laufen: Wenn ich nicht die Simulation verwenden, alles geht nach rechts Wenn ich die Simulation verwenden und die gefälschtes Kapital, alles geht richtig

Aber wenn ich die Simulation benutze und ich das reale Kapital verwenden möchte, ist die UsableBalance var seltsam, nicht sofort, aber wenn das Skript läuft! Ich versuche, besser zu erklären

Nehmen wir an, dass ich die Simulationsphase verwenden und ich möchte die wirkliche Hauptstadt

Ihre Ballance bedienen: 87.26 Bits. Ich verwende: 87 Bits für diese Sitzung als Ihre Anfrage.

hier alles in Ordnung, aber dieser Code:

if (TemporaryLoss <= 0) { 
    Capital += LastProfit; 
    UsableBalance = Math.floor((PercentOfTotal/100) * Capital); 
    TemporaryLoss = 0; 
} 

Return dies:

TemporaryLoss: 0 
Capital: 87.26 
LastProfit: 1.0299999999999998 
PercentOfTotal: 100 
Capital: 87.261.0299999999999998 

Warum die Mathematik diese seltsame Zahl zurückgeben? Wie eine Verkettung von 2 Zahlen? Scheint, dass das Skript die var wie einen Text und nicht wie eine Zahl verwendet.

Irgendeine Idee?

+0

Sie müssen möglicherweise 'parseInt' oder' parseFloat' verwenden –

+0

Es lohnt sich, einen Schritt zurückzutreten und darüber nachzudenken, wie Sie mit Währungswerten und Genauigkeitsverlust aufgrund von Gleitkomma-Konvertierungen umgehen (besonders wenn Sie Math.floor verwenden)() 'wie Sie hier sind. [Weitere Informationen finden Sie [die Diskussion hier] (http://stackoverflow.com/questions/1458633/how-to-deal-with-floating-point-number-precision-in-javascript) Im Allgemeinen ist es auch sinnvoll, Währungswerte in 'Cents' (oder was auch immer der niedrigste mögliche Währungswert ist) oder als Strings zu behandeln, um die meisten grundlegenden Präzisionsprobleme zu umgehen. – Andrew

+0

Mögliche Duplikate von [Javascript - NaN] (http: // stackoverflow.com/questions/25747520/javascript-nan) – rockerest

Antwort

3

Sie machen einen String mit toFixed()

var Capital = (engine.getBalance()/100).toFixed(2); 

und verwendet es später als Zahl, aber es ist eine Zeichenfolge.

Capital += LastProfit; 

Lösung: Bei Bedarf festgelegt ist, dann parseFloat() verwenden, um eine Nummer erneut zu machen.

+1

Nein, das ist kein Problem, '*' wandelt die Zeichenfolge zurück in Zahl. – georg

+0

@georg, rechts, aber das Problem ist hier: 'Capital + = LastProfit;' 'Capital' ist eine Zeichenkette und Addieren behält die Zeichenkette, mit dem oben erwähnten Ergebnis der Verkettung. –

+0

Ja, das ist richtig. Ich würde vorschlagen, das OP entfernt nur 'toFixed' – georg

0

Nehmen wir ein Beispiel:

var x = 1;

var y = '1';

var z = x + (y*10)

der Datentyp der Variablen y implizit Nummer für den aktuellen Betrieb dazu gezwungen wird, der Wert von z zu bewerten.

Also, für z, y als eine Zahl genommen, weil (y*10) impliziten Zwang verursacht, aber nicht y selbst

In Ihrem Fall

var Capital = (Motor-Nummer ändern. getBalance()/100) .toFixed (2);

bewirkt, dass Capital eine Zeichenfolge wird. Daher führen alle weiteren Additionsoperationen mit Capital zu einer Verkettung Sie müssen explizit in int oder float konvertieren, wie bereits erwähnt.