2013-02-26 60 views
1

我在MongoDB中收集了一個產品。運行Express 3和Mongoose的應用程序。我正在拍賣,當我嘗試將產品的價格增加0.01時,它會在第6次時正常工作,然後進入「1000.0699999999999」而不是1000.07。任何想法爲什麼?再次點擊幾次後,將會是:1000.1699999999998等等。幾次後貓鼬增值錯誤

這裏我更新功能:

app.post('/auctions/add', function(req, res){ 

    //Get username 
    var user = req.session.username ; 

    //Product ID from form 
    var productID = req.body.product_id ; 

    //Find and update product 
    //Products.update({ id: productID }, { price: this.price + 0.01 }).exec() ; 
    Products.update({ id: productID }, {$inc: { price: .01 }, user_bidding: { username: user, timeBid: new Date() }}, function(err, numberAffected, raw) { 

    console.log(err); 
    console.log(numberAffected); 
    console.log(raw); 

    }) ; 

    //redirect to home 
    res.redirect('/'); 

}) ; 
+2

這是因爲您使用'double'來存儲價格,雙打往往只是近似值。將您的價格存儲爲美分的整數。 – JohnnyHK 2013-02-26 22:03:50

+1

是的,我有同樣的問題。結束存儲美分。這就是我們在PayPal所做的。 – chovy 2013-02-26 23:43:26

回答

2

這是不是一個貓鼬的問題..這是怎麼了JavaScript的工作......在JavaScript 0.1 + 0.2 !== 0.3。這是因爲浮點運算是不準確(或至少不是你所期望的)..但是浮點運算中的整數運算是精確的..你可以將值轉換爲整數,進行求和,然後除以保留原樣。

示例。

(0.1 * 10 + 0.2 * 10)/10 === 0.3

所以你的情況類似

var price = 1000; 
price = (price*100 + 0.01*100)/100 // => 1000.01; 

編輯:

BTW建議在仙上班真是再好不過了..你應該考慮到這一點

0

我認爲price.toFixed(3)是更好的解決方案。沒有美分,沒有期限。

+1

請解釋你的答案 – 2015-11-11 01:32:43

+0

浮點格式錯誤是微不足道的。正如你用來修正你的價值觀以忽略這一點。這是浮點格式的想法。你必須至少增加9999999999 0.01的誤差爲0.01。這種方式轉換爲固定解決了一個問題。 – xbtc 2015-11-12 07:29:07

+0

另外,如果您有意製作大量操作,則可以使用JavaScript庫進行任意精度的小數運算。 – xbtc 2015-11-12 07:40:51