2015-01-28 61 views
2

JavaScript에서 반올림에 문제가 있습니다. 나는 라운딩 기능을 사용하고 있습니다 :JavaScript의 라운딩 문제

function roundup(rnum, rlength){ 
    var newnumber = Math.round(rnum * Math.pow(10, rlength))/Math.pow(10, rlength); 
    return newnumber; 
} 

var amount = roundup(2253.825, 3); 

이상한 일이, 내가 수 2253.825를 반올림 할 때, 그 결과는 2253.83 수있다 2253.82입니다. 숫자 5592.825을 반올림하면 결과는 5592.83이며 올바른 것입니다.

어떻게 해결할 수 있습니까?

+0

: http://www.smbc-comics.com/index.php?db=comics&id=2999 여기

이 교정보다 강력한 방법입니다 #comic :) – meskobalazs

+0

@Grimbode, 내 피들을 한번보세요. 2020.825 값을 추가했는데 제대로 작동합니다. http://jsfiddle.net/poqnnxyo/2/ –

+0

질문 : _up_을 라운드하려고합니까, 아니면 그냥 돌고 있습니까? 반올림하고 싶다면'Math.ceil'로 전환하면 문제가 해결 될 것입니다. – JLRishe

답변

0

부동 소수점 반올림 오류가 잘못되었습니다. 2620.825 * 100262082.49999999997이므로 반올림 할 때 결과는 262082입니다.

function round(rnum, rlength) { 
 
    var shifted = rnum * Math.pow(10, rlength), 
 
     rounded = Math.round(shifted), 
 
     delta = Math.abs(shifted - rounded); 
 

 
    if (delta > 0.4999999 && delta < 0.5) { 
 
     rounded += (rounded < 0 ? -1 : 1); 
 
    } 
 

 
    return rounded/Math.pow(10, rlength); 
 
} 
 

 
console.log("2620.825 :=> " + roundup(2620.825, 2)); 
 
console.log("2621.825 :=> " + roundup(2621.825, 2)); 
 
console.log("2620.8255 :=> " + roundup(2620.8255, 2));
관련

+0

감사합니다. –

0

IEEE 754가 두 배로 작동하는 방식 때문에 본질적으로 문제가 나타납니다. 수학적으로 정확한 결과를 항상 얻으려면 사용자 정의 데이터 유형 (예 : this one과 같은 BigDecimal 구현)을 사용해야합니다.

유용 할 수도 있으므로 answer도보십시오.