JavaScript로 숫자의 소수 부분을 가져옵니다


248

내가 좋아하는 부동 소수점 숫자를 가지고 3.21.6.

숫자를 정수와 소수로 분리해야합니다. 예를 들어, 값이 3.2두 숫자로 분할 할 것, 즉 30.2

정수 부분을 얻는 것은 쉽습니다.

n = Math.floor(n);

그러나 소수 부분을 얻는 데 문제가 있습니다. 나는 이것을 시도했다 :

remainer = n % 2; //obtem a parte decimal do rating

그러나 항상 올바르게 작동하지는 않습니다.

이전 코드에는 다음과 같은 출력이 있습니다.

n = 3.1 => remainer = 1.1

내가 여기서 무엇을 놓치고 있습니까?


1
공지 사항 n = Math.floor(n);만이 아닌 음수 원하는 결과 (정수 부분)를 반환
tsemer

간단히 사용 % 1하지 마십시오% 2
masterxilo

답변:


366

사용 1하지 말고 사용하십시오 2.

js> 2.3 % 1
0.2999999999999998

60
0.2999999999999998이 0.3 인 세계에서는 이것이 허용 될 수 있습니다. 나에게는 그렇지 않습니다 ... 따라서,이 도전을 해결하기 위해 나는 사용 Math.*또는 %작업을 삼가고 싶었습니다 .
Marcel Stör

62
언급 된 부동 소수점 반올림 문제를 피하기 위해를 사용하면 toFixed일부 상황에서 도움이 될 수 있습니다 (예 : (2.3 % 1).toFixed(4)==) "0.3000".
Brian M. Hunt

12
(2.3 % 1).toFixed(4).substring(2)= "3000"필요없는 경우0.
Simon_Weaver

14
세상에서 숫자는 어디에서 2.3생겨, 그리고 한 2또는 3수, 0.2999999999999998그것은 인간의 눈에 보이는 모욕하는 방법에도 불구하고 완벽하게 허용됩니다.
Gershom

1
@GershomMaes 그 숫자를 받아 들일 수없는 다양한 상황이 있습니다.
Adam Leggett

92
var decimal = n - Math.floor(n)

마이너스 숫자에는 작동하지 않으므로해야 할 수도 있습니다.

n = Math.abs(n); // Change to positive
var decimal = n - Math.floor(n)

정수 부분이 이미 있으면 Math.floor()다시 호출 할 필요가 없습니다 . 계산 한 정수 부분 만 사용하십시오.
tvanfosson

4
var n = 3.2, integr = Math.floor(n), decimal = n - integr;사용 Math.floor () 한 번만를. integr = 3; decimal = 0.20000000000000018;
Nurlan

2
음수를 사용하기 위해서, 단순히 교체 Math.floor와 함께 Math.trunc.
Igor Silva

이것은 0.79999가 아닌 100.80에서 0.80을 얻을 것으로 예상되는 것과 같이 정확하지 않은 숫자를 반환했습니다 ... decimal.toFixed (2)
Luis Febro

77

문자열로 변환 할 수 있습니까?

n = (n + "").split(".");

17
이것은 쉼표가 소수점 구분 기호 인 유럽 대륙을 제외한 모든 곳에서 잘 작동합니다. 이 솔루션을 사용할 계획이라면 다국적이며 유럽을 대상으로하는 경우이 솔루션을 사용하면 큰 도움이되지 않으므로이를 고려해야합니다.
cdmdotnet

8
프랑스 Firefox를 사용하는 유럽 대륙 출신이며 작동합니다. 일반적으로 프랑스에서는 쉼표를 소수점 구분 기호로 사용합니다. JavaScript에서 Number를 문자열로 변환 할 때 문화 n.toString()n + ""없기 때문에 더 읽기 쉽기 때문에 대신 사용하는 것이 좋습니다 .
Gabriel Hautclocq

2
속도가 중요하면 n + ""실제로 더 좋습니다 ( jsperf.com/number-vs-number-tostring-vs-string-number 참조 )
Gabriel Hautclocq

@cdmdotnet JS는 .소수점 구분 기호로 사용되므로 입력 변수의 유형이 부동 소수점이면 어디서나 괜찮습니다. 입력이 문자열 인 경우에만 해당 문제를 처리해야합니다. 또한이 답변은 배열의 문자열을 반환합니다. 보다 완벽한 해결책은 다음과 같습니다.parseFloat('0.' + (n + '').split('.')[1])
totymedli

@cdmdotnet 위치 독립적 인 솔루션은 여기에 있습니다 : stackoverflow.com/a/59469716/1742529
user1742529

32

0.2999999999999998은 어떻게 받아 들일 수 있습니까? 내가 실수 한 사람이라면 나는 .3의 답을 원할 것입니다. 여기서 우리가 가진 것은 허위 정밀도이며, floor, % 등을 사용한 실험은 Javascript가 이러한 연산에 대해 허위 정밀도를 좋아한다는 것을 나타냅니다. 따라서 문자열 변환을 사용하는 답변이 올바른 방향에 있다고 생각합니다.

나는 이것을 할 것이다 :

var decPart = (n+"").split(".")[1];

특히 100233.1을 사용하고 있는데 ".1"이라는 답을 원했습니다.


6
나는 일반적으로 동의하지만 '.'에 의존 할 수는 없습니다. 소수점 구분 기호 인 정규식 은 i18n 문자 입니다.
Marcel Stör

1
@jomofrodo 실제로 일부는 반올림되지 않은 값을 원할 수 있습니다. 반올림 값을 요구하는 OP를 기억하지 않고 값을 나눕니다.
VVV

1
@VVV 예, 일부는 반올림되지 않은 값을 원할 수 있습니다. 그러나 소수점 이하 9 자리까지 정밀도를 원한다고해서 입력 데이터가 실제로이를 지원한다는 의미는 아닙니다. 그것이 "거짓 정밀도"라고 불리는 이유입니다. 입력 값이 3.1 인 경우 답이 가질 수있는 가장 정확한 정밀도는 10 분의 1, 즉 0.1입니다. .09라고 대답하면 실제로 원래 입력이 10 정밀도까지만 정확했을 때 실제로 100 정밀도로 계산 / 측정했음을 의미합니다.
jomofrodo 2014

1
쉽게 처리 할 수있는 @ MarcelStör : var decPart = (n.toLocaleString ( "en")). split ( ".") [1];
jem

1
.toString()i18n을 고려하지 않습니다. 소수점 구분 기호는 항상 . MDNECMA 사양
Andrewmat

18

내가하는 방법은 다음과 같습니다. 가장 쉬운 방법이라고 생각합니다.

var x = 3.2;
int_part = Math.trunc(x); // returns 3
float_part = Number((x-int_part).toFixed(2)); // return 0.2

15

이를 수행하는 간단한 방법은 다음과 같습니다.

var x = 3.2;
var decimals = x - Math.floor(x);
console.log(decimals); //Returns 0.20000000000000018

불행히도 정확한 값을 반환하지는 않습니다. 그러나 그것은 쉽게 수정됩니다.

var x = 3.2;
var decimals = x - Math.floor(x);
console.log(decimals.toFixed(1)); //Returns 0.2

소수점 이하 자릿수를 모르는 경우이를 사용할 수 있습니다.

var x = 3.2;
var decimals = x - Math.floor(x);

var decimalPlaces = x.toString().split('.')[1].length;
decimals = decimals.toFixed(decimalPlaces);

console.log(decimals); //Returns 0.2


9

언어 독립적 인 방법 :

var a = 3.2;
var fract = a * 10 % 10 /10; //0.2
var integr = a - fract; //3

fractioanal 길이가 하나 인 숫자에 대해서만 수정됨에 유의하십시오.)


3
이것이 언어에 독립적이라고 생각하는 이유를 설명 할 수 있습니까? JavaScript입니다.
hotzst

4
@hotzst, 언어 별 기능이 없습니다
Nurlan

1
순수한 수학이기 때문에 언어 독립적. 실용적인 솔루션. 원하는 분수 길이 :var factor = Math.pow(10, desiredFractionLength); var fract = a * factor % factor / factor;
muratgozel

6

parseInt()함수를 사용하여 소수 부분을 추출하는 것보다 정수 부분을 얻을 수 있습니다

var myNumber = 3.2;
var integerPart = parseInt(myNumber);
var decimalPart = myNumber - integerPart;

또는 다음과 같은 정규식을 사용할 수 있습니다.

splitFloat = function(n){
   const regex = /(\d*)[.,]{1}(\d*)/;
   var m;

   if ((m = regex.exec(n.toString())) !== null) {
       return {
          integer:parseInt(m[1]),
          decimal:parseFloat(`0.${m[2]}`)
       }
   }
}

decimalPart이오고 0.20000000000000018이 정말 있기 때문에 할 하드지고 ... 0.2 < 0.20000000000000018true를 반환 ... 가정 3.2은 0.2을 반환 : P 그렇게 많은 부정을 만들고 사용하여 .toFixed(2)반환에게 문자열을 : P
Himanshu 반살

@HimanshuBansal은 JavaScript 문제입니다 ( 스택 오버 플로우 질문 ). 내가 제안한 두 번째 방법을 사용할 수 있습니다.
Sheki

글쎄, 나는 약간 다른 문제 진술을 가지고있다 ... Kinda는 두 가지 방법을 사용했습니다 : P 그것을 해결 .. ^^
Himanshu Bansal

@HimanshuBansal 내 게시물이 문제 해결에 도움이 된 것을 기쁘게 생각합니다!
Sheki

5

다음은 구분 기호에 한 문자 만 사용되는 조건에서 소수점 구분 기호의 지역 설정에 관계없이 작동합니다.

var n = 2015.15;
var integer = Math.floor(n).toString();
var strungNumber = n.toString();
if (integer.length === strungNumber.length)
  return "0";
return strungNumber.substring(integer.length + 1);

예쁘지는 않지만 정확합니다.


물론 문자열이므로 숫자로 원하면 먼저 parseInt ()해야 할 수도 있습니다. 나는 8 개 기본하지 열 개 번호를 기본으로 여기에 누락 뭔가 거기를 제외하고는 ...)에서는 parseFloat (필요가 없습니다 ... 뭔가를 내가 막연 년 전에서 기억
cdmdotnet

5

정밀도가 중요하고 일관된 결과가 필요한 경우 선행 "0"을 포함하여 숫자의 소수 부분을 문자열로 반환하는 몇 가지 제안이 있습니다. 플로트로 필요 var f = parseFloat( result )하면 끝에 추가 하십시오.

소수 부분이 0이면 "0.0"이 반환됩니다. Null, NaN 및 정의되지 않은 숫자는 테스트되지 않습니다.

1. String.split

var nstring = (n + ""),
    narray  = nstring.split("."),
    result  = "0." + ( narray.length > 1 ? narray[1] : "0" );

2. String.substring, String.indexOf

var nstring = (n + ""),
    nindex  = nstring.indexOf("."),
    result  = "0." + (nindex > -1 ? nstring.substring(nindex + 1) : "0");

3. Math.floor, Number.toFixed, String.indexOf

var nstring = (n + ""),
    nindex  = nstring.indexOf("."),
    result  = ( nindex > -1 ? (n - Math.floor(n)).toFixed(nstring.length - nindex - 1) : "0.0");

4. Math.floor, Number.toFixed, String.split

var nstring = (n + ""),
    narray  = nstring.split("."),
    result  = (narray.length > 1 ? (n - Math.floor(n)).toFixed(narray[1].length) : "0.0");

다음은 jsPerf 링크입니다. https://jsperf.com/decpart-of-number/

제안 # 2가 가장 빠르다는 것을 알 수 있습니다.


이 중 어느 것도 사용하지 마십시오. 숫자 렌더링이 엔지니어링으로 전환되는 즉시 중단됩니다. 또한 로케일에 민감하지 않습니다.
Spongman

"엔지니어링으로 렌더링하는 숫자 렌더링"에 대해 설명해 주시겠습니까? 또한 지역화는 숫자를 나타내는 지역화 된 문자열이 아닌 숫자의 소수 부분 만 원하기 때문에 관련이 없습니다.
Gabriel Hautclocq

4

문자열로 변환하고 replace메소드를 사용 하여 정수 부분을 0으로 바꾸고 결과를 다시 숫자로 변환 할 수 있습니다.

var number = 123.123812,
    decimals = +number.toString().replace(/^[^\.]+/,'0');

쉼표가 소수점 구분 기호 인 유럽 대륙에서는이 솔루션이 작동하지 않습니까?
프레스턴

@preston 정규식의 점을 원하는 다른 구분 문자 (예 :)로 바꿀 수 /^[^,]/있지만 결과 +를 피하려면 NaN결과 를 문자열로 남겨 두어야합니다 ( 연산자를 제거하십시오 ) .
gion_13

4

사용법에 따라 나중에 제공하지만이 간단한 솔루션도 도움이 될 수 있습니다.

좋은 해결책은 아니지만 구체적인 경우에는 효과가 있습니다.

var a = 10.2
var c = a.toString().split(".")
console.log(c[1] == 2) //True
console.log(c[1] === 2)  //False

그러나 @Brian M. Hunt가 제안한 솔루션보다 시간이 오래 걸립니다.

(2.3 % 1).toFixed(4)

1
이것은 쉼표가 소수점 구분 기호 인 유럽 대륙을 제외한 모든 곳에서 잘 작동합니다. 이 솔루션을 사용할 계획이라면 다국적이며 유럽을 대상으로하는 경우이 솔루션을 사용하면 큰 도움이되지 않으므로이를 고려해야합니다.
cdmdotnet

1

나는 문제의 모든 숫자가 하나의 소수점 만 가질 것이라는 것을 알고 사례에 정수로 소수 부분을 얻고 싶기 때문에 이런 종류의 접근 방식을 사용했습니다.

var number = 3.1,
    decimalAsInt = Math.round((number - parseInt(number)) * 10); // returns 1

이것은 정수에서도 잘 작동하며 그 경우 0을 반환합니다.


1

나는 사용하고있다 :

var n = -556.123444444;
var str = n.toString();
var decimalOnly = 0;

if( str.indexOf('.') != -1 ){ //check if has decimal
    var decimalOnly = parseFloat(Math.abs(n).toString().split('.')[1]);
}

입력 : -556.123444444

결과 : 123444444


1

수학 함수는 빠르지 만 항상 기본 예상 값을 반환하지는 않습니다. 내가 찾은 가장 쉬운 방법은

(3.2+'').replace(/^[-\d]+\./, '')

1

좋은 옵션은 숫자를 문자열로 변환 한 다음 나누는 것입니다.

// Decimal number
let number = 3.2;

// Convert it into a string
let string = number.toString();

// Split the dot
let array = string.split('.');

// Get both numbers
// The '+' sign transforms the string into a number again
let firstNumber  = +array[0]; // 3
let secondNumber = +array[1]; // 2

한 줄의 코드에서

let [firstNumber, secondNumber] = [+number.toString().split('.')[0], +number.toString().split('.')[1]];

0

이 중 몇 가지를 본 후 지금 사용하고 있습니다 ...

var rtnValue = Number(7.23);
var tempDec = ((rtnValue / 1) - Math.floor(rtnValue)).toFixed(2);


0

이 답변에 매우 늦었지만 코드를 살펴보십시오.

let floatValue = 3.267848;
let decimalDigits = floatValue.toString().split('.')[1];
let decimalPlaces = decimalDigits.length;
let decimalDivider = Math.pow(10, decimalPlaces);
let fractionValue = decimalDigits/decimalDivider;
let integerValue = floatValue - fractionValue;

console.log("Float value: "+floatValue);
console.log("Integer value: "+integerValue);
console.log("Fraction value: "+fractionValue)

0

부동 소수점 10 진수 기호 및 숫자 형식은 국가 ( .,)에 따라 달라질 수 있으므로 부동 소수점 부분을 보존하는 독립 솔루션은 다음과 같습니다.

getFloatDecimalPortion = function(x) {
    x = Math.abs(parseFloat(x));
    let n = parseInt(x);
    return Number((x - n).toFixed(Math.abs((""+x).length - (""+n).length - 1)));
}

– 위치에 의존하지 않고 국제화 된 솔루션입니다.

getFloatDecimalPortion = x => parseFloat("0." + ((x + "").split(".")[1]));

단계별 솔루션 설명 :

  1. parseFloat() 입력 인식 보장
  2. Math.abs() 음수 문제를 피하기 위해
  3. n = parseInt(x) 소수 부분을 얻기 위해
  4. x - n 소수점 이하 빼기
  5. 우리는 이제 소수점 이하 0의 숫자를 가지지 만 JavaScript는 부동 소수점을 추가로 줄 수 있습니다.
  6. 따라서 toFixed()원래 float number의 부동 부분에서 자릿수를 호출 하여 추가 자릿수를 제한하십시오 x. 개수는 문자열 표현에서 원래 숫자의 길이 x와 숫자 의 차이로 계산됩니다 n.

-1

이것을 사용하십시오 :

function isNatural(n) {
    n = +n
    if (isNaN(n)) return 'NaN';
    return (n >= 0.0) && (Math.floor(n) === n) && n !== Infinity;
  }

Math.frac = function frac(x, m) {
    x = +x
    if (isNaN(x)) return NaN;
    if (isNatural(x) === true) return 0;
    m = +m || 1

      if (isNatural(x) === false && m === 1){
        var a = x.toString()
        var b = a.split('.')[1]
        var c = '0.' + b
        var d = +c
        return d;
      }

      if (isNatural(x) === false && m === 2){
        var a = x.toString()
        var b = a.split('.')[1]
        var c = +b
        return c;
      }

      if (isNatural(x) === false && m === 3){
        var a = x.toString()
        var b = a.split('.')[1]
        var c = '0.' + b
        var d = +c * 100
        return d;
      }    
  }

Math.frac기능에는 3 가지 모드가 있습니다.

Math.frac(11.635) //0.635
Math.frac(11.635, 1) //0.635 - default mode is 1
Math.frac(11.635, 2) //635
Math.frac(11.635, 3) //63,5 (%)

간단 해 :)


-9
float a=3.2;
int b=(int)a; // you'll get output b=3 here;
int c=(int)a-b; // you'll get c=.2 value here

4
그것은 나에게 자바 스크립트처럼 보이지 않습니다!
Ch'marr

1
이것은 자바 스크립트가 아닙니다
Amrut

JS에서는 다음과 같아야합니다. var a = 3.2; var b = parseInt (a, 10); var c = a-b;
Ju-v
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.