programing

JavaScript에서 정수 나눗셈을 수행하고 나머지를 별도로 얻는 방법은 무엇입니까?

firstcheck 2022. 11. 27. 15:45
반응형

JavaScript에서 정수 나눗셈을 수행하고 나머지를 별도로 얻는 방법은 무엇입니까?

JavaScript에서 다음 정보를 얻으려면:

  1. 주어진 정수가 다른 정수로 들어가는 횟수?
  2. 나머진요?

번호의 경우, ★★★★★★★★★y 어떤 (약수)xquotient([1] ) 및 나머지 (remainder와 같이 말합니다.

const quotient = Math.floor(y/x);
const remainder = y % x;

예:

const quotient = Math.floor(13/3); // => 4 => the times 3 fits into 13  
const remainder = 13 % 3;          // => 1

[1] 한 숫자를 다른 숫자로 나눈 정수

비트 연산자에 대해서는 잘 모르지만, 여기에 전체 숫자를 얻는 다른 방법이 있습니다.

var num = ~~(a / b);

하지만, 에서도 잘 통합니다.Math.floor()이치노

이것도 맞는 것 같습니다.

var num = (a / b) >> 0;

파이어폭스에서 속도 테스트를 좀 해봤어요.

-100/3             // -33.33..., 0.3663 millisec
Math.floor(-100/3) // -34,       0.5016 millisec
~~(-100/3)         // -33,       0.3619 millisec
(-100/3>>0)        // -33,       0.3632 millisec
(-100/3|0)         // -33,       0.3856 millisec
(-100-(-100%3))/3  // -33,       0.3591 millisec

/* a=-100, b=3 */
a/b                // -33.33..., 0.4863 millisec
Math.floor(a/b)    // -34,       0.6019 millisec
~~(a/b)            // -33,       0.5148 millisec
(a/b>>0)           // -33,       0.5048 millisec
(a/b|0)            // -33,       0.5078 millisec
(a-(a%b))/b        // -33,       0.6649 millisec

위의 내용은 각 1000만 번의 시행을 기준으로 합니다.

결론:사용하다(a/b>>0) (오류)(~~(a/b)) ★★★★★★★★★★★★★★★★★」(a/b|0)를 통해 약의할 수 를 통해 약 20%의 효율성 향상을 달성할 수 있습니다. 이 이 다 '아', '아', '아', '아', '아', '아', '아, 아', '아', '아', '아', '아, 아', '아', '아', '아', '아', '아', '아', '아', '아', '아', '아', '아', '아', '아', '아', '아', '아', '아', '아', '아', '아', '아', '아',Math.floor의 경우, 삭제a/b<0 && a%b!=0.

ES6에서는 새로운 방법이 도입되었습니다.이를 통해 @MarkElliot의 답변을 수정하여 음수에도 사용할 수 있습니다.

var div = Math.trunc(y/x);
var rem = y % x;

:Math메서드는 비트 연산자에 비해 2보다 큰31 숫자로 작동한다는 장점이 있습니다.

주로 사용하는 것은 다음과 같습니다.

const quotient =  (a - a % b) / b;
const remainder = a % b;

아마 가장 우아하지는 않겠지만 효과가 있어요.

var remainder = x % y;
return (x - remainder) / y;

때 이 할 수 .parseInt을 사용하다

parseInt(a/b)

나머지를 얻으려면 mod 연산자를 사용합니다.

a%b

parseInt에는 base 10에 radix 파라미터를 사용하지 않도록 문자열에 몇 가지 함정이 있습니다.

parseInt("09", 10)

경우에 따라서는 숫자의 문자열 표현이 과학적 표기법일 수 있습니다.이 경우 해석은Int는 잘못된 결과를 생성합니다.

parseInt(100000000000000000000000000000000, 10) // 1e+32

이 콜은 결과적으로 1을 생성합니다.

Math.floor(operation)반올림된 연산 값을 반환합니다.

1개의 질문의st 예:

const x = 5;
const y = 10.4;
const z = Math.floor(x + y);

console.log(z);

두 가지 질문의nd 예:

const x = 14;
const y = 5;
const z = Math.floor(x % y);

console.log(x);

JavaScript는 음수의 바닥과 정수 이외의 나머지 숫자를 수학적으로 정의하여 계산합니다.

FLOOR는 "파라미터보다 작은 가장 큰 정수"로 정의되며, 다음과 같이 정의됩니다.

  • 양수: FLOOR(X)=X의 일부만 표시;
  • 음수: FLOOR(X)=X 빼기 1의 일부를 표시합니다(파라미터보다 작아야 하므로 더 음수여야 합니다).

REMINT는 나눗셈의 "왼쪽"으로 정의됩니다(유클리드 산술).배당이 정수가 아닐 때, 그 몫은 보통 정수가 아니다. 즉, 나머지가 없다. 그러나 만약 그 몫이 정수가 되도록 강요된다면, 누군가 부동 소수점 숫자의 나머지 또는 계수를 얻으려고 할 때, 분명히 정수가 아닌 "남은 것"이 있을 것이다.

JavaScript는 모든 것을 예상대로 계산하기 때문에 프로그래머는 적절한 질문을 할 때 주의해야 합니다(그리고 사람들은 질문받은 것에 대답할 때 주의해야 합니다).야린의 첫 번째 질문은 "X를 Y로 나눈 정수 나눗셈은 무엇인가"가 아니라 "일정한 정수가 다른 정수로 들어가는 전체 횟수"였다.정수 나눗셈(나눗셈)은 숫자(나눗셈)가 다른 숫자로 "가는" 횟수(나눗셈)보다 -1 작기 때문에 양수의 경우 답은 동일하지만 음수의 경우에는 동일하지 않습니다.즉, FLOOR는 음수의 정수 나눗셈에 대한 정답을 반환하지만, Yarin은 그것을 묻지 않았습니다!

Gammax가 정확하게 대답했어요. 그 코드는 Yarin이 요청한 대로 작동합니다.한편, Samuel은 틀렸다.그는 계산을 하지 않았다.그렇지 않으면 그는 그것이 효과가 있다는 것을 알았을 것이다(또한 그는 그의 예시의 약수가 무엇이었는지 말하지 않았지만, 나는 그것이 3이었으면 좋겠다).

나머지 = X % Y = -100 % 3 = -1

GosInto = (X - 나머지) / Y = (-100 - - 1) / 3 = -99 / 3 = -33

참고로 Firefox 27.0.1에서 코드를 테스트했는데, 예상대로 양수, 음수, 그리고 정수 이외의 값도 배당과 제수로 사용되었습니다.예:

-100.34 / 3.57 : GosInto = -28, 나머지 = -0.380000000079

네, 거기에 정밀도 문제가 있다는 것을 알았습니다만, 확인할 시간이 없었습니다(Firefox, Windows 7 또는 CPU의 FPU 중 어느 쪽에 문제가 있는지 모르겠습니다).하지만 야린의 질문에는 정수만 포함되는데, Gamax의 코드는 완벽하게 작동합니다.

const idivmod = (a, b) => [a/b |0, a%b];

계수추가 정수 수학에 대한 제안도 있습니다.

Alex Moore-Niemi의 답변:

에서 검색한 루비스트 divmod , 하다, 하다, 하다, 이렇게 하면 됩니다.

function divmod(x, y) {
  var div = Math.trunc(x/y);
  var rem = x % y;
  return [div, rem];
}

결과:

// [2, 33]

javascript의 Math.floor 함수를 사용하여 작업을 수행할 수 있습니다.Math.floor는 지수를 반환하고 %는 나머지를 반환합니다.

const quotient = Math.floor(a/b);
const remainder = a % b;

3진수를 사용하여 양의 정수값과 음의 정수값을 처리하는 방법도 결정할 수 있습니다.

var myInt = (y > 0) ? Math.floor(y/x) : Math.floor(y/x) + 1

수치가 양수이면 모두 괜찮습니다.숫자가 음수일 경우 Math.floor가 음수를 처리하는 방식을 고려하여 1이 추가됩니다.

이것은 항상 0을 향해 잘립니다.너무 늦은 것인지는 모르겠지만, 여기 있습니다.

function intdiv(dividend, divisor) { 
    divisor = divisor - divisor % 1;
    if (divisor == 0) throw new Error("division by zero");
    dividend = dividend - dividend % 1;
    var rem = dividend % divisor;
    return { 
        remainder: rem, 
        quotient: (dividend - rem) / divisor
    };
}

2의 거듭제곱으로 나누는 경우 다음과 같은 비트 연산자를 사용할 수 있습니다.

export function divideBy2(num) {
  return [num >> 1, num & 1];
}

export function divideBy4(num) {
  return [num >> 2, num & 3];
}

export function divideBy8(num) {
  return [num >> 3, num & 7];
}

(첫 번째가 지수이고 두 번째가 나머지)

페이지 수 계산은 1단계로 실행할 수 있습니다.Math . ceil ( x / y )

JS 런타임에서 나타낼 수 없는 매우 큰 정수의 나머지를 계산할 필요가 있는 경우(2^32보다 큰 정수는 플로트로 표시되므로 정밀도가 저하됨) 몇 가지 트릭을 수행해야 합니다.

이것은 특히 일상생활의 많은 경우에 존재하는 수표 자릿수(은행 계좌 번호, 신용 카드 등)를 확인하는 데 중요합니다.

우선 번호가 문자열로 필요합니다(그렇지 않으면 이미 정밀도가 떨어지고 나머지는 의미가 없습니다).

str = '123456789123456789123456789'

이제 문자열을 더 작은 부분으로 분할해야 합니다. 나머지 부분과 문자열 조각을 9자리로 연결할 수 있습니다.

digits = 9 - String(divisor).length

문자열을 분할할 정규 표현식 준비

splitter = new RegExp(`.{1,${digits}}(?=(.{${digits}})+$)`, 'g')

예를 들어, 만약digitsregexp는 7, regexp는

/.{1,7}(?=(.{7})+$)/g

이 값은 최대 길이 7의 비어 있지 않은 하위 문자열과 일치합니다(다음).(?=...)는 7의 배수인 여러 글자에 의한 플러스 예측입니다.'g'는 식을 모든 문자열에서 실행하며 첫 번째 일치에서 멈추지 않습니다.

이제 각 부품을 정수로 변환하고 남은 부분을 다음과 같이 계산합니다.reduce(이전 나머지 또는 0에 10의 올바른 거듭제곱을 곱한 값을 되돌립니다.

reducer = (rem, piece) => (rem * Math.pow(10, digits) + piece) % divisor

이는 "감산" 나머지 알고리즘 때문에 작동합니다.

n mod d = (n - kd) mod d

이는 숫자의 십진수 표현의 '초기 부분'을 마지막 나머지에 영향을 주지 않고 나머지로 대체할 수 있습니다.

최종 코드는 다음과 같습니다.

function remainder(num, div) {
  const digits = 9 - String(div).length;
  const splitter = new RegExp(`.{1,${digits}}(?=(.{${digits}})+$)`, 'g');
  const mult = Math.pow(10, digits);
  const reducer = (rem, piece) => (rem * mult + piece) % div;

  return str.match(splitter).map(Number).reduce(reducer, 0);
}
 function integerDivison(dividend, divisor){
    
        this.Division  = dividend/divisor;
        this.Quotient = Math.floor(dividend/divisor);
         this.Remainder = dividend%divisor;
        this.calculate = ()=>{
            return {Value:this.Division,Quotient:this.Quotient,Remainder:this.Remainder};
        }
         
    }

  var divide = new integerDivison(5,2);
  console.log(divide.Quotient)      //to get Quotient of two value 
  console.log(divide.division)     //to get Floating division of two value 
  console.log(divide.Remainder)     //to get Remainder of two value 
  console.log(divide.calculate())   //to get object containing all the values

여기 방법이 있습니다.(개인적으로는 이렇게 하는 것이 아니라, 예를 들면 재미있는 방법이라고 생각합니다.)위의 방법은 여러 함수를 호출하기 때문에 속도가 느릴 뿐만 아니라 번들의 공간을 차지하기 때문에 확실히 더 좋습니다.

function intDivide(numerator, denominator) {
  return parseInt((numerator/denominator).toString().split(".")[0]);
}

let x = intDivide(4,5);
let y = intDivide(5,5);
let z = intDivide(6,5);
console.log(x);
console.log(y);
console.log(z);

언급URL : https://stackoverflow.com/questions/4228356/how-to-perform-an-integer-division-and-separately-get-the-remainder-in-javascr

반응형