2013-02-26 5 views
1

Ive가 MongoDB의 컬렉션 제품을 가지고 있습니다. Express 3 및 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('/'); 

}) ; 
+2

가격을 저장하는 데 'double'을 사용하고 있기 때문에 두 배는 단지 근사치이기 때문입니다. 가격을 센트의 정수로 대신 저장하십시오. – JohnnyHK

+1

네,이 같은 문제가있었습니다. 센트를 저장하는 것을 끝내었다. 그것이 PayPal에서 한 것입니다. – chovy

답변

2

이 ..이 적어도 몽구스 문제 자바 스크립트 0.1 + 0.2 !== 0.3이 ..이 소수점 연산 부동 정확한되지 않기 때문에 어떻게 작동 자바 스크립트 ... (또는하지 않습니다 당신이 기대하는 것이 아닙니다.) .. 그러나 부동 소수점 연산의 정수 산술 연산은 정확합니다. 정수로 값을 변환하고, 합계를 만들고, 모든 것을 그대로 남겨 둘 수 있습니다 ..

예.

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

수정 같은 케이스 뭔가 너무

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

: 센트에서 일할 수

BTW 제안이 정말 좋다 .. 당신은 계정

에 그 소요
0

나는 price.toFixed (3)가 더 나은 해결책이라고 생각한다. 센트가없고 기간도 없습니다.

+1

대답을 설명하십시오. –

+0

부동 소수점 형식의 오류는 무시해도 좋습니다. 당신이 사용하는 것처럼 이것을 보지 않으려면 값을 반올림하십시오. 이것은 부동 소수점 형식의 아이디어입니다. 0.01의 오차를 가지기 위해서는 최소한 9999999999를 0.01만큼 더해야합니다. 이 방법으로 toFixed는 문제를 해결합니다. – xbtc

+0

또한, 많은 연산을 수행하려는 경우 임의 정밀도 10 진수 산술에 JavaScript 라이브러리를 사용할 수 있습니다. – xbtc

관련 문제