2012-04-03 5 views
7

이상한 문제가 생겨서 기본적인 수학 검사를하고 싶습니다. 부동 수치를 피하기 위해 읽었으므로 은 내 값이 012와 0.0025 사이 일 수 있으므로 으로의 숫자 값을 곱합니다. 0.56 및 0.57 :JavaScript가 곱셈이 정확하지 않음

var result = 0.57 * 10000 

결과가 있습니다 :

모든 것은 두 값을 제외하고 올바른 작동 5699.999999999999, 나는 5700 희망! 그리고 0.56도 잘못되었지만 다른 모든 값은 정확합니다. 여기서 무엇을 놓치고 있습니까?

+4

[모든 컴퓨터 과학자는 부동 소수점 연산에 관한 숙지 사항 (http://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html) –

+0

유사 콘텐츠! – kojiro

답변

3

자바 스크립트 (실제로는 대부분의 언어)에서 선택하는 항목은 정수 또는 부동 소수점 숫자입니다. "0.57"을 쓰면 정확도가 제한된 부동 소수점의 세계로 강요됩니다.

절대적인 정확도를 원하면 정수로만 작업해야합니다.

3
var result = 0.57 * 10000; 
alert (Math.round(result));​ 
0

해키 솔루션 : value.toFixed(4).substr(-4).replace(/^0+/, "");

11

가장 좋은 솔루션에서는 toFixed (X)를 사용하는, 항상 예상 된 결과의 소수점 이하이어야한다 소수의 숫자 x를 설정합니다 (나는 보통이 8을 넣어).

그러나 해킹 대신 키릴 로이드와 같이 결과를 다시 숫자로 변환하여 불필요한 소수를 제거해야합니다. 그 후에 원하는 번호의 서식을 수행하십시오.

그래서이 필요한 결과를 반환 :

var result = +(0.57 * 10000).toFixed(8) 

결과는 지금 앞에 5700

+를 다시 숫자로 "에서는 toFixed"의 문자열 결과를 변환 할 것이다.

희망이 도움이되었습니다!

0
var multiply = function(a, b) { 
    var commonMultiplier = 1000000; 

    a *= commonMultiplier; 
    b *= commonMultiplier; 

    return (a * b)/(commonMultiplier * commonMultiplier); 
}; 

이것은 알려진 범위에서 작동합니다. 따라서 숫자를 commonMultiplier보다 작은 소수점으로 반올림하는 것이 좋습니다. 유명한 골드버그 @JamesAllardice

> multiply(3, .1) 
< 0.3 
> multiply(5, .03) 
< 0.15