앞의 단어로 작성 :
오늘 저는 동료가 문제를 해결하도록 도와주었습니다. 즉, 소수점을 곱할 때 나타나는 소수점 자리가 많이 있다는 것입니다. 나는이 문제를 전에 발생 했으므로 구체적으로 요약 할 것입니다.
숫자 유형 :
숫자 유형은 ECMAScript에서 가장 일반적으로 사용되고 가장 흥미로운 유형입니다. 이 유형은 IEEE754 형식을 사용하여 정수 및 부동 소수점 값을 나타냅니다 (부동 소수점 값은 일부 언어의 이중 정제 값입니다). 다양한 데이터 유형을 지원하기 위해 ECMA-262는 다른 수치 표면 형식을 정의합니다.
소수:
var intnum = 10; //정수
10 월 :
var Octalnum1 = 070; // 10 월 56 일
var Octalnum2 = 079; // 유효하지 않은 옥탈 값은 79로 분해됩니다
옥탈 리터럴은 엄격한 모드에서 유효하지 않습니다.
16 진수 :
var hexnum1 = 0xa; // 10
기억하십시오 : 작업을 수행 할 때, 10 대와 16 진수로 표현 된 모든 값은 결국 소수로 변환됩니다.
소수의 작동에 오류가있는 이유는 무엇입니까?
부동 소수점 값의 가장 높은 진보는 17 자리 소수점이지만 정확도는 작업을 수행 할 때 정수보다 훨씬 적습니다. 작업을 수행 할 때 정수는 10 진수로 변환됩니다. 그리고 Java 및 JavaScript에서 소수점 작업을 계산할 때, 소수점 소수점은 먼저 해당 바이너리로 변환되며 일부 소수점은 이진으로 완전히 변환 할 수 없으므로 첫 번째 오류가 여기에서 발생합니다. 모든 소수점이 이진으로 변환 된 후, 이진 작업을 수행하기 위해 이진 작업을 수행합니다. 그런 다음 이진 결과를 소수로 변환하면 두 번째 오류는 일반적으로 여기에서 발생합니다.
그래서 (0.1+0.2)! = 03
해결책:
프로그램 코드
정확한 분할 결과를 얻기위한 분할 기능
참고 : JavaScript의 분할 결과에 오류가 발생하며, 이는 두 개의 부동 소수점 번호를 나누면 더 분명합니다. 이 기능은보다 정확한 분할 결과를 반환합니다.
전화 : accdiv (arg1, arg2)
반환 값 : ARG1의 정확한 결과는 Arg2로 나뉩니다.
함수 accdiv (arg1, arg2) {var t1 = 0, t2 = 0, R1, R2; try {t1 = arg1.tostring (). split ( ".") r2 = 숫자 (arg2.toString (). Replace ( ".", ")) retur (r1/r2)*pow (10, t2-t1);}}숫자 유형에 div 메소드를 추가하는 것이 더 편리합니다.
번호 .prototype.div = function (arg) {return accdiv (this, arg); }정확한 곱셈 결과를 얻기위한 곱셈 기능
참고 : JavaScript의 곱셈 결과에는 오류가 발생하며, 이는 두 개의 부동 소수점 번호를 곱할 때 더 분명합니다. 이 기능은보다 정확한 곱셈 결과를 반환합니다.
전화 : Accmul (arg1, arg2)
반환 값 : Arg1의 정확한 결과에 Arg2를 곱했습니다.
함수 AccMul (arg1, arg2) {var m = 0, s1 = arg1.tostring (), s2 = arg2.tostring (); try {m+= s1.split ( ".")숫자 유형에 MUL 메소드를 추가하는 것이 편리합니다.
번호 .prototype.mul = function (arg) {return accmul (arg, this);}정확한 추가 결과를 얻기위한 추가 기능
참고 : JavaScript의 추가 결과에는 오류가 발생하여 두 개의 부동 소수점 번호를 추가 할 때 더 분명합니다. 이 기능은보다 정확한 추가 결과를 반환합니다.
전화 : Accadd (Arg1, Arg2)
반환 값 : Arg1 + Arg2의 정확한 결과
함수 acadd (arg1, arg2) {var r1, r2, m; {r1 = arg1.tostring (). split ( ".") (arg1*m+arg2*m)/m}숫자 유형에 추가 메소드를 추가하여 호출하는 것이 더 편리합니다.
번호 .prototype.add = function (arg) {return accadd (arg, this);}사용하려는 기능을 포함시킨 다음 호출하여 계산하십시오.
예를 들어, 계산하려면 7*0.8을 계산하려면 (7) .mul (8)로 변경하십시오.
다른 작업은 유사하며보다 정확한 결과를 얻을 수 있습니다.
Solution 2:
보다 일반적으로 사용되는 방법 인 tofixed () 및 tofixed () 메소드는 지정된 소수점 번호로 숫자로 숫자로 반올림 할 수 있습니다. 계산 결과 후이 방법을 추가하는 것은 괜찮습니다. 그러나 정확도에 약간의 영향을 미칩니다. 정확도 요구 사항이 높지 않은 경우 사용하는 것이 좋습니다.