ошибки округления javascript nodejs

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

var buy_amount = 132.32000000;                      //amount in bitcoin
var buy_amount_satoshi = buy_amount*100000000;      //amount in satoshi
var sell_rate = 10.00000000;                        //USD rate
var spend_usd = buy_amount_satoshi*sell_rate;   //total USD
var spend_display = spend_usd/100000000;        //total USD user display

console.log(spend_usd.toFixed(8));              //132320000000.00000000
console.log(spend_display.toFixed(8));              //1323.20000000

jsfiddle.net/XjLLS/

  1. умножьте сумму на 100000000, чтобы получить нет. сатоши - Правильное обращение с деньгами
  2. умножьте сумму на курс
  3. добавить к результату 8 знаков после запятой

я делаю это правильно? я ценю вашу помощь!


ОБНОВЛЕНИЕ: теперь я использую библиотеку bigdecimal.js и сделал следующий фрагмент:

var bigdecimal = require("bigdecimal");

var mode = bigdecimal.RoundingMode.HALF_EVEN(); //default: DOWN
var satoshi = new bigdecimal.BigDecimal("100000000");

var buy_amount = new bigdecimal.BigDecimal("132.32000000"); //amount in bicoin
var amount_minor = buy_amount.multiply(satoshi); //amount in satoshi
var sell_rate = new bigdecimal.BigDecimal("10.00000000"); //sell rate usd
var spend_minor = amount_minor.multiply(sell_rate);
var user_spend = spend_minor.divide(satoshi, 8, mode); //total usd user must spend
var user_display = user_spend.toString();
console.log(user_display);

jsfiddle.net/wwpWA/

режим округления по умолчанию - DOWN, но я установил его на HALF_EVEN, он же округление банкира (округление банкира распространено при работе с деньгами)

я надеюсь, что все ошибки округления теперь исчезли! пожалуйста, поправьте меня, если я ошибаюсь!


person user3510638    schedule 09.04.2014    source источник
comment
Вероятно, вам нужно что-то другое, кроме JavaScript.   -  person Evan Knowles    schedule 09.04.2014
comment
Как правило, расчеты производятся в младших единицах (наверное, в центах?) и в конце конвертируются в основные единицы (доллары?). Вы не говорите, какой уровень точности вам требуется.   -  person RobG    schedule 09.04.2014
comment
сумма равна биткойнам, и я умножаю ее на 100000000, чтобы получить младшую единицу! (1btc = 100000000 сатоши), мне нужно 8 знаков после запятой   -  person user3510638    schedule 09.04.2014


Ответы (1)


попробуй это

var buy_amount = 132.32000000;                     
var buy_amount_satoshi = (parseFloat(buy_amount)*100000000).toFixed(8);     
var sell_rate = 10.00000000;                        
var spend_satoshi = (parseFloat(buy_amount_satoshi)*parseFloat(sell_rate)).toFixed(8);   
var spend_display = (parseFloat(spend_satoshi)/100000000).toFixed(8);  
person King of kings    schedule 09.04.2014
comment
toFixed — это метод , возможно, вы хотели назвать это… ;-) - person RobG; 09.04.2014
comment
с помощью toFixed вы получите 8 знаков после запятой. и это предопределенная функция - person King of kings; 09.04.2014
comment
parseFloat применяется к номеру? Неееет! - person Bergi; 09.04.2014
comment
без добавления parseFloat вы не можете достичь toFixed - person King of kings; 09.04.2014
comment
Все Number — нет необходимости анализировать переменные, которые уже определены с числовыми значениями. И наоборот, toFixed полезен только для целей отображения - если вы применяете его к переменным до того, как закончите какие-либо вычисления, вы активно вносите ошибки в точность. - person Emissary; 09.04.2014
comment
@ Эмиссар, как вы думаете, мои расчеты точны или у меня проблемы с округлением? - person user3510638; 09.04.2014
comment
@user3510638 user3510638 недостаточно информации - я обобщал использование toFixed в этом примере, что снижает точность до завершения математики. - person Emissary; 09.04.2014
comment
@Emissary Я поэкспериментировал со своим кодом сверху для тестирования, какая информация вам еще нужна? - person user3510638; 09.04.2014
comment
Могу ли я ожидать, что все будет рассчитано правильно? нужен ответ! - person user3510638; 28.05.2014