JavaScript 번호에서 소수 부분을 제거하려면 어떻게해야합니까?


218

나눗셈 결과가 있고 결과 숫자의 소수 부분을 버리고 싶습니다.

어떻게해야합니까?

답변:


384

당신은 사용할 수 있습니다 ...

... 소수점 제거 방법에 따라 다릅니다.

Math.trunc()아직 모든 플랫폼 (IE)에서 지원되지는 않지만 그 동안 폴리 필 을 쉽게 사용할 수 있습니다 .

우수한 플랫폼지지를 갖는 분수 부분을 절단하는 다른 방법은 비트 연산자 (예를 들어 |0)를 사용하는 것이다. 숫자에 비트 연산자를 사용하는 부작용은 피연산자를 부호있는 32 비트 정수로 취급하므로 분수 구성 요소가 제거된다는 것입니다. 이것은 또한 32 비트보다 큰 숫자를 맹 글링한다는 것을 명심하십시오.


부동 소수점 산술과 십진 반올림의 부정확성에 대해 이야기 할 수도 있습니다.

필요한 읽기-모든 컴퓨터 과학자가 부동 소수점 산술에 대해 알아야 할 사항 .


29
숫자가 음수 이면 숫자 값 Math.floor()증가 한다는 점에 유의하십시오 . 따라서 동안 . ( @FloydPink에서 언급했듯이 )는 양수음수 모두에 대해 예상되는 소수 부분을 버립니다 . Math.floor(-1.2) -> -2Math.floor(1.2) -> 1parseInt(-1.2) -> -1
Paul T. Rawkeen

1
@ PaulT.Rawkeen 비트 연산자를 사용하여 소수 부분을 제거 할 수도 있지만 32 비트로 잘립니다.
alex

2
다음은이 답변이 불안정하다는 것을 보여줍니다.> (2.305*100)|0 > 230 > (2.3*100)|0 > 229
Jake

4
@Jake 2.3*100javascript 의 결과는 입니다 229.99999999999997. 비트 연산자가 예제에서 올바르게 작업하는 것 같습니다.
차드 폰 나우

|064 비트 정수를 사용 하는 것과 비슷한 솔루션이 있습니까?
클린트

49

비트 연산자를 사용하여 소수를자를 수도 있습니다.

예 :

var x = 9 / 2;
console.log(x); // 4.5

x = ~~x;
console.log(x); // 4

x = -3.7
console.log(~~x) // -3
console.log(x | 0) // -3
console.log(x << 0) // -3

비트 단위 연산은 수학 함수보다 훨씬 효율적입니다. 비트가 아닌 비트 연산자는 무시할 정도로 비트 연산 x | 0x << 0비트 연산의 성능을 약간 능가합니다 .

// 952 milliseconds
for (var i = 0; i < 1000000; i++) {
    (i * 0.5) | 0;
}

// 1150 milliseconds
for (var i = 0; i < 1000000; i++) {
    (i * 0.5) << 0;
}

// 1284 milliseconds
for (var i = 0; i < 1000000; i++) {
    Math.trunc(i * 0.5);
}

// 939 milliseconds
for (var i = 0; i < 1000000; i++) {
    ~~(i * 0.5);
}

또한 비트 단위 연산자가 산술 연산보다 우선하므로 계산 결과를 괄호로 묶어야 원하는 결과를 얻을 수 있습니다.

x = -3.7

console.log(~~x * 2) // -6
console.log(x * 2 | 0) // -7
console.log(x * 2 << 0) // -7

console.log(~~(x * 2)) // -7
console.log(x * 2 | 0) // -7
console.log(x * 2 << 0) // -7

이중 비트 NOT 연산자에 대한 자세한 정보는 Double bitwise NOT (~~) 에서 찾을 수 있습니다.


2
약간 효율적일 수 있습니다. 그러나 나는 더 읽기 쉬운 'Math'기능을 제안 할 것입니다.
ashipj

정수가 32 비트 부호있는 정수 ( stackoverflow.com/a/7488075/3655192 ) 로 표시되지 않으면 작동하지 않을 가능성이 있습니다.
Hiroki

30

당신은 또한 할 수 있습니다

parseInt(a/b)

17
parseInt를 문자열로 인수를 변환 첫째로 작동하기 때문에, 많은 수에 대해 안정적으로 작동하지 않으며, 많은 수의 결과가 지수 표기법을 사용합니다. 예를 들어 , var n = 22222222222222222222222; parseInt(n);will은 return 2이므로를 n.toString()반환합니다 2.2222222222222223e+22.

2
또한 parseInt()문자열로 숫자를 가져 와서 a를 반환하는 목적으로 사용하지 않습니다 Number.
alex

22

u는 다음 코드를 사용하여 소수점 이하의 특정 자릿수 (여기서는 두 자리 숫자)를 표시 할 수도 있습니다

var num = (15.46974).toFixed(2)
console.log(num) // 15.47
console.log(typeof num) // string


4
toFixed ()는 숫자가 아닌 문자열을 반환합니다. developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
Jeanmichel Cote

1
OP가 소수 부분을 제거하도록 요구하는 답변은 어떻습니까?
Isaac

3
문자열을 반환하지만 Number () 메서드를 사용하여 바로 수정할 수 있습니다. Number ((15.46974) .toFixed (2))
iPzard

13

Math.round()기능을 사용하십시오 .

Math.round(65.98) // will return 66 
Math.round(65.28) // will return 65

17
완전성을 위해 이것은 쿼리가 아닌 일반 JavaScript입니다.
Dave Newton

1
$.round = Math.round;)
alex


6

ES2015에서는 Math.trunc () 를 사용할 수 있습니다.

Math.trunc(2.3)                       // 2
Math.trunc(-2.3)                      // -2
Math.trunc(22222222222222222222222.3) // 2.2222222222222223e+22
Math.trunc("2.3")                     // 2
Math.trunc("two")                     // NaN
Math.trunc(NaN)                       // NaN

IE11 이하에서는 지원되지 않지만 Edge 및 다른 모든 최신 브라우저에서는 작동합니다.


2
X 소수점 이하 자릿수로자를 수있는 변형을 알고 있습니까? 그것이 효과가 있다고 생각하는 Math.trunc(value * Math.pow(10,x)) / Math.pow(10,x)것이 순진 합니까?
jamiebarrow

2
Jamie, 대부분의 경우에 효과가있는 것처럼 보이지만 부동 소수점 문제에 취약합니다. 예 value = 2.3x = 2들어을 반환 2.29합니다. 더 나은 제안이 없습니다.
Chad von Nau

나에게 이것은 정답처럼 들립니다. 반올림하지 않습니다. 음수에 문제가 없습니다. 소수를 버립니다. 질문에 따라.
엔리케 모레노 텐트

2

라우팅에 신경 쓰지 않는다면 숫자를 문자열로 변환 한 다음 마침표를 포함하여 마침표 이후의 모든 것을 제거하십시오. 이것은 소수가 있는지 여부에 관계없이 작동합니다.

const sEpoch = ((+new Date()) / 1000).toString();
const formattedEpoch = sEpoch.split('.')[0];

1

toFixed는 라운드처럼 동작합니다.

행동과 같은 층에는 %를 사용하십시오.

var num = 3.834234;
var floored_num = num - (num % 1); // floored_num will be 3

2
왜 이것이 Math.floor를 사용하는 것보다 낫다고 생각합니까? 귀하의 솔루션은 불필요하게 복잡하고 느려 보입니다. Math.floor의 작동 방식을 모르지만 훨씬 더 최적화 될 것으로 기대합니다. 또한 솔루션에서 부동 소수점 반올림 오류가 발생할 수 있는지 궁금합니다.
Hans Roerdinkholder

1

위의 게시물을 통해 자세한 설명이 압축되어 있습니다.

1. Math.trunc () : 뒤에 오는 숫자를 제거하는 데 사용됩니다. 암시 적으로 변환합니다. 그러나 IE에서는 지원되지 않습니다.

예:

Math.trunc (10.5) // 10

Math.trunc (-10.5) // -10

다른 대안 : 비트 단위 연산자 사용 :

예:

x = 5.5

~~ x // 5

2. Math.floor () : 가능한 최소 정수 값을 제공하는 데 사용됩니다. 모든 브라우저에서 지원됩니다.

예:

Math.floor (10.5) // 10

Math.floor (-10.5) // -11

3. Math.ceil () : 가능한 가장 높은 정수 값을주기 위해 사용됩니다. 모든 브라우저에서 지원됩니다.

예:

Math.ceil (10.5) // 11

Math.ceil (-10.5) // -10

4. Math.round () : 가장 가까운 정수로 반올림됩니다. 모든 브라우저에서 지원됩니다.

예:

Math.round (10.5) // 11

수학 라운드 (-10.5) // -10

Math.round (10.49) // 10

Math.round (-10.51) // -11


1

예를 들어 :

var x = 9.656;
x.toFixed(0);           // returns 10
x.toFixed(2);           // returns 9.66
x.toFixed(4);           // returns 9.6560
x.toFixed(6);           // returns 9.656000 

또는

parseInt("10");         // returns 10
parseInt("10.33");      // returns 10
parseInt("10 20 30");   // returns 10
parseInt("10 years");   // returns 10
parseInt("years 10");   // returns NaN  

나는 왜이 답변에 어떤 kudos가 없는지 알지 못한다. 그것은 나를 위해 일하고 반응 / 자바 스크립트 표준
cwiggo에

0

ES6 구현의 경우 다음과 같은 것을 사용하십시오.

const millisToMinutesAndSeconds = (millis) => {
  const minutes = Math.floor(millis / 60000);
  const seconds = ((millis % 60000) / 1000).toFixed(0);
  return `${minutes}:${seconds < 10 ? '0' : ''}${seconds}`;
}

0

사용자가 10 진수를 입력하지 못하게하려는 경우

<input id="myInput" onkeyup="doSomething()" type="number" />

<script>
    function doSomething() {

        var intNum = $('#myInput').val();

        if (!Number.isInteger(intNum)) {
            intNum = Math.round(intNum);
        }

        console.log(intNum);
    }
</script>

0

.toFixed (0)를 사용하여 완전한 소수 부분을 제거하거나 소수를자를 수있는 인수의 숫자를 제공 할 수 있습니다.

참고 : toFixed는 숫자를 문자열로 변환합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.