2016-04-03 9 views
2

Хорошо, я не кодер, у меня нет школы об этом, но ... Я не могу понять, почему эта маленькая операция возвращает значение NaN!Javascript возвращает значение NaN после математической операции

Я это вар в начале

// 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; 
} 

Так что, если я активировать similation вар, и если я хочу использовать другой капитал, сценарий использовать fakecapital, чтобы проверить мой сценарий.

Здесь все работает, но я думаю, что здесь есть проблема, специально UsableBalance = Math.floor(PercentOfTotal/100 * Capital);

Потому что, когда запускаемый скрипт: Если я не использую моделирование, все идет правильно Если я использую моделирование и поддельный капитал, все идет правильно

Но если я использую симуляцию, и я хочу использовать реальный капитал, UsableBalance var странный, не сразу, а при запуске скрипта! Я пытаюсь объяснить лучше

Давайте предположим, что я использую фазы моделирования и я хочу использовать реальный капитал

Вашего балланса является: 87.26 бит. Я буду использовать: 87 бит для этого сеанса, как ваш запрос.

Здесь все нормально, но этот код:

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

Вернуться это:

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

Почему математика вернуть этот странный номер? как конкатенация двух чисел? Кажется, что сценарий использует var как текст, а не как цифры.

Любая идея?

+0

Возможно, вам придется использовать 'parseInt' или' parseFloat' –

+0

. Стоит сделать шаг назад и подумать о том, как вы обрабатываете значения валюты и теряете точность из-за конверсий с плавающей запятой (особенно если вы используете 'Math.floor() ', как вы здесь. См. [обсуждение здесь] (http://stackoverflow.com/questions/1458633/how-to-deal-with-floating-point-number-precision-in-javascript) для получения дополнительной информации Кроме того, в целом также стоит обрабатывать валютные значения в 'cents' (или независимо от минимально возможного значения валюты) или в качестве строк, чтобы обойти большинство проблем с базовой точностью. – Andrew

+0

Возможный дубликат [Javascript - NaN] (http: // stackoverflow.com/questions/25747520/javascript-nan) – rockerest

ответ

3

Вы делаете строку с toFixed()

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

и использовать его позже как число, но это строка.

Capital += LastProfit; 

Решение: Если фиксируется необходимо, а затем использовать parseFloat(), чтобы сделать номер еще раз.

+1

Нет, это не проблема, '*' преобразует строку обратно в число. – georg

+0

@georg, но проблема здесь: 'Capital + = LastProfit;' 'Capital' - это строка и добавление сохраняет строку с указанным результатом конкатенации. –

+0

Да, это правильно. Я бы предложил, чтобы OP просто удалял 'toFixed' – georg

0

Давайте рассмотрим пример:

var x = 1;

var y = '1';

var z = x + (y*10)

тип данных переменной у неявно приводится к числу для текущей операции, чтобы оценить величину г.

Так, г, у берется как число, так как (y*10) вызвало неявное принуждение, но не меняет у себя на номер

В вашем случае,

вар капитал = (двигатель. getBalance()/100). toFixed (2);

приводит к тому, что капитал становится строкой. Следовательно, любые дальнейшие операции добавления с Капиталом приводят к конкатенации Вам нужно будет явно преобразовать в int или float, как упоминалось ранее.

Смежные вопросы