2

MongoDBにコレクションProductsがあります。Express3とMongooseを実行しているアプリ。オークションを行っていますが、商品の価格を0.01上げようとすると、6回目までは正常に動作し、その後、1000.07ではなく「1000.0699999999999」になります。なぜですか?さらに数回クリックすると、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( '/' );

}) ;
4

2 に答える 2

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;

編集:

ところで、セントで作業するという提案は本当に優れています..それを考慮に入れる必要があります

于 2013-02-26T22:17:41.110 に答える