2013-02-26 61 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