2014-04-09 68 views
-1

我希望一切都準確,加起來,我不能讓總數成爲一分錢。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. 乘以量與億拿到沒有。 satoshis的 - Proper Money Handling
  2. 乘以量與速度
  3. 加入8位小數的結果

我是這樣做的權利?我感謝您的幫助!


UPDATE: 我現在使用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/

默認舍入模式但我把它設置爲HALF_EVEN aka銀行家的四捨五入(銀行家的四捨五入是常見的工作時用錢)

我希望所有的舍入錯誤現在都消失了!如果我錯了,請糾正我!

+1

你可能想不是JavaScript等,然後東西。 –

+0

通常情況下,計算是在次要單位(我猜這裏是美分?)完成,並在最後轉換爲主要單位(美元?)。你不會說你需要什麼精度水平。 – RobG

+0

金額是比特幣,我乘以100000000獲得次要單位! (1btc = 100000000 satoshi),我需要8位小數 – user3510638

回答

0

試試這個

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); 
+0

[* toFixed *](http://ecma-international.org/ecma-262/5.1/#sec-15.7.4.5)是一種方法,也許你的意思是稱之爲... ;-) – RobG

+0

通過使用toFixed您將獲得8位小數位。並且它是一個預定義函數 –

+1

'parseFloat'應用於一個數字? Noooooo! – Bergi