2015-08-17 2 views
1

У меня есть этот блок, который вытаскивает текущую сумму, уплаченную за предмет из Firebase, и сумму, выплачиваемую на данный момент. Затем предполагается добавить их вместе, чтобы сделать третью переменную.JQuery Calculation drop cents

По какой-то причине код понижает котировки от общей суммы.

singleRef.once("value", function(snapshot) { 

    var a = parseInt(snapshot.val().amounts.paid); // The amount already paid 

    var b = parseInt(invoice.payment.amount); // The amount being applied 

    var c = a + b; 

    console.log(c); 
}); 

Допустим, происходит следующее:

a = 0; 
b = 10.86; 

The result in this code will be:

c = 10; // should be 10.86 

Допустим, происходит следующее:

a = 10.00; 
b = 10.86; 

The result in this code will be:

c = 20; // should be 20.86 

Это не имеет значения то, что центы, он всегда округляет, чтобы избавиться от них. Я попытался добавить .toFixed('2') ко всем переменным, просто a и b, и просто c. Все результаты равны нулю.

КАК !? Я пытался сделать это в течение последних нескольких часов, это, наверное, просто, но я не могу понять это. Это сводит меня с ума! Я использую angularjs и firebase.

+3

Вы вызываете 'parseInt()', который анализирует только целые числа. Вы получите лучшие результаты, если используете 'parseFloat()'. См. Https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/parseInt и https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects./parseFloat. Но обратите внимание, что JavaScript не целое число - это плавающая точка, что является очень неточным способом отслеживания денег (в какой-то момент вы получите ошибки округления). Обычно вы лучше отслеживаете деньги в центах, так как тогда вы всегда работаете целыми числами. –

+0

@FrankvanPuffelen Итак, было бы лучше взять введенную пользователем сумму и перевести ее на центы? Я хочу быть уверенным, что я делаю то, что лучше.Если это так, можете ли вы дать ответ на примере этого. Я ценю объяснения! – moevans

+1

@Frank, если быть точным, если вы просто добавляете и вычитаете, ваш «в какой-то момент» довольно далеко от вас, включая * много * операций :-) Хорошо знать, но маловероятно на практике. Неаддитивные изменения (умножение, деление, функции более высокого порядка) являются более проблематичными. – paxdiablo

ответ

1

Функция parseInt() является специально для разбора целых чисел так, если вы даете ему 3.14159, это даст вам обратно 3.

Если вы хотите проанализировать значение с плавающей запятой, попробуйте parseFloat().

Например, следующий код:

var a = parseInt("3.141592653589"); 
var b = parseInt("2.718281828459"); 
var c = a + b; 
alert(c); 
var d = parseFloat("3.141592653589"); 
var e = parseFloat("2.718281828459"); 
var f = d + e; 
alert(f); 

даст вам два различных выхода:

5 
5.859874482047999 
1

Как уже упоминалось другие, вы не можете разобрать долларов и центов с parseInt().

И использование поплавков - плохая идея для любых финансовых/денежных.

Большинство финансовых систем просто хранят цены/долларовые значения в центах, вы можете написать функцию для ее удобного форматирования для пользователей, если необходимо отобразить значения.

function(cents) { 
    cents = +cents; // unary plus converts cents into a string 
    return "$" + cents.substring(0, cents.length - 2) + "." + cents.substring(cents.length - 2); 
}