JS의 플로팅 -포인트 유형은 어떻습니까?
예를 들어 : var a = 0.69;
var c = a*10을 쓰기 위해 직접 6.9를 얻고 싶습니다.
경고 (C); 결과는 6.899999999999995입니다
온라인으로 검색 할 때 일부 네티즌은 이것이 JS 플로팅 -포인트 계산 버그라고 말하면서 해결책을 찾았습니다.
방법 1 : JS 사용자 정의 기능
다음과 같이 코드 코드를 복사하십시오.
<cript>
// 정확한 추가 결과를 얻기 위해 메소드를 추가합니다
// 설명 : JavaScript의 결과에 오류가 발생하며 두 개의 플로팅 포인트 번호가 추가되면 더 분명합니다. 이 기능은 추가 결과를 더 정확하게 반환합니다.
// 전화 : aCDD (arg1, arg2)
// 반환 값 : Arg1 + Arg2의 정확한 결과
함수 acadd (arg1, arg2) {{
var r1, r2, m;
{r1 = arg1.toString ()을 시도하십시오 ( ".") [1] .length} catch (e) {r1 = 0}
{r2 = arg2.toString ().
m = math.pow (10, math.max (R1, R2))))
return (arg1*m+arg2*m)/m
}
// 호출이 더 편리한 숫자 유형에 추가 메소드를 추가합니다.
번호 .prototype.add = function (arg) {
acadd (arg, this)를 반환합니다.
}
// 정확한 추가 결과를 얻기 위해 메소드를 추가합니다
// 설명 : JavaScript의 결과에 오류가 발생하며 두 개의 플로팅 포인트 번호가 추가되면 더 분명합니다. 이 기능은 추가 결과를 더 정확하게 반환합니다.
// 전화 : aCDD (arg1, arg2)
// 반환 값 : Arg1 + Arg2의 정확한 결과
함수 accsub (arg1, arg2) {{
var r1, r2, m, n;
{r1 = arg1.toString ()을 시도하십시오 ( ".") [1] .length} catch (e) {r1 = 0}
{r2 = arg2.toString ().
m = math.pow (10, math.max (r1, r2));
// 마지막으로 Deeka에 의해 수정됩니다
// 동적 제어 정확도 길이
n = (r1> = r2)?
return ((arg1*m-rg2*m)/m) .tofixed (n);
}
// 메소드를 제거하는 정확한 방법을 얻는 메소드를 제외하고
// 설명 : JavaScript의 결과에 오류가 발생하며 두 개의 플로팅 포인트 번호가 제거 될 때 분명합니다. 이 기능은보다 정확한 제거 결과를 반환합니다.
// 전화 : accdiv (arg1, arg2)
// 반환 값 : ARG1 ARG2의 정확한 결과를 제외한 Arg1
함수 accdiv (arg1, arg2) {{
var T1 = 0, T2 = 0, R1, R2;
{t1 = arg1.toString ()을 시도하십시오 ( "."[1] .length} catch (e) {}.
{t2 = arg2.toString ()을 시도하십시오 ( ".") [1] .length} catch (e) {}.
(수학) {
r1 = 숫자 (arg1.toString (). 교체 ( ".", ""))
r2 = 숫자 (arg2.toString (). 교체 ( ".", ""))
반환 (R1/R2)*Pow (10, T2-T1);
}
}
// 숫자 유형에 div 메소드를 추가하는데, 이는 호출이 더 편리합니다.
번호 .prototype.div = function (arg) {
return accdiv (this, arg);
}
// 정확한 곱셈 결과를 얻기위한 곱셈 기능
// 설명 : JavaScript 곱셈 결과의 결과는 오류가 발생하며 두 개의 플로팅 포인트 숫자가 곱하면 분명합니다. 이 기능은보다 정확한 곱셈 결과를 반환합니다.
// 전화 : accmul (arg1, arg2)
// 반환 값 : Arg1은 Arg2의 정확한 결과를 곱합니다.
기능 Accmul (Arg1, Arg2)
{{
varm m = 0, s1 = arg1.tostring (), s2 = arg2.tostring ();
{m+= s1.split ( ".") [1] .length} catch (e) {} 시도하십시오.
{m+= s2.split ( ".") [1] .length} catch (e) {} 시도하십시오.
반환 번호 (s1.replace ( ".", "")*번호 (s2.replace ( ".", "") /math.pow (10, m)
}
// 숫자 유형에 MUL 메소드를 추가하여 호출하는 것이 더 편리합니다.
번호 .prototype.mul = function (arg) {
반환 accmul (arg, this);
}
var a = 0.69;
var b = 10;
경고 (a*b); // 6.899999999995
경고 ((A*100)/10);
</스크립트>
기능을 직접 호출하십시오.
방법 2 : 소수점 숫자의 수를 알고 있다면, 정수에 부유 식 -Point 번호의 수를 지루하게하는 것을 고려할 수 있습니다 (최종적으로 해당 배수를 나누십시오).
경고 (11*22.9); // 251.89999999998
경고 (11*(22.9*10)/10);