2014-09-05 3 views
0

Я учу себя JavaScript и столкнулся с проблемой withFixed(). Я работаю через калькулятор амортизации; и один из шагов возвращает число с большим количеством десятичных знаков. Я пытаюсь сократить его до 4 знаков после запятой. Следует иметь в виду, что пример кода содержит много объяснительного HTML. Это только там, так что я могу работать через шаги уравнения. Кроме того, когда я добавляю один к очень длинному номеру, он добавляет цифру к концу научной нотации.toFixed ничего не делает

var paymentamount; 
var principal=250000; 
var interestrate = 4.5; 
var annualrate = interestrate/12; 
var numberofpayments = 360; 
document.write("This is the annuitized interest rate: "+ annualrate +"%"); 
document.write("<h3> Now we add 1 to the annualized interest rate</h3>"); 
var RplusOne = annualrate + 1; 
document.write("<p> This is One Added to R: " + RplusOne + "%"); 
document.write("<h3>Next RplusOne is Raised to the power of N </h3>"); 
var RRaised = (Math.pow(RplusOne, numberofpayments)).toFixed(4); 
document.write("<p>This gives us the following very long number, even thought it shouldn't: " + RRaised); 
document.write("<h3>Now we add one to the very long number </h3>"); 
var RplusOne = RRaised + 1; 
document.write("<p>Now we've added one: " + RplusOne); 
+1

Функция '.toFixed()' возвращает строку ** **, а не число. – Pointy

ответ

3

От MDN's documentation:

Если число больше 1e + 21, этот метод просто вызывает Number.prototype.toString() и возвращает строку в экспоненциальной записи.

Проблема заключается в том, что вы используете 4.5 в качестве процентной ставки вместо 0.045, так как это сделать:

Math.pow(4.5/12 + 1, 360) 

дает огромное количество (6.151362770461608e+49 или 6.15 * 10^49 быть точным). Измените свою процентную ставку до 0.045, и вы получите то, что ожидаете.

Что касается линии var RplusOne = RRaised + 1, проблема здесь в том, что RRaised является строкой из-за toFixed. Я бы назвал только toFixed, когда вы показываете вещи, а не в любое другое время; основной причиной этого было бы избежать ошибок округления в последующих вычислениях, но имеет дополнительное преимущество в том, что ваши переменные остаются числами, а не строками.

+0

Спасибо. Это была глупая математическая ошибка с моей стороны. Курс в 450% довольно высок. – user3483571

+0

'RRaised' по-прежнему будет строкой из-за типа возвращаемого типа' toFixed', поэтому '+ 1' все равно добавит к нему символ' 1' вместо выполнения арифметики. – ajp15243

+0

Вы можете изменить следующую строку на 'var RplusOne = RRaised * 1 + 1;'. Это будет напечатано как RRaised как число. –

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