我在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( '/' );
}) ;
答案 0 :(得分:3)
这不是一个猫鼬问题..这就是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以美分为单位的建议确实更好......你应该考虑到这一点
答案 1 :(得分:0)
我认为price.toFixed(3)是更好的解决方案。没有美分,没有时期。