숫자의 정수 및 소수 부분을 얻는 방법?


98

1.25라고 가정하면이 숫자의 "1"과. "25"부분을 어떻게 얻습니까?

소수점이 .0, .25, .5 또는 .75인지 확인해야합니다.


간단한 폭발이 작동합니까? $ splitDec = explode ( ".", $ decimal); $ splitDec [0]은 이제 1이되고 splitDec [1]은 이제 25가됩니다.
Matt

@Matt split()는 더 이상 사용되지 않습니다.
alex

@alex 예, 잊었습니다. 자바 스크립트를 생각했습니다. 폭발로 변경되었습니다.
Matt

@Matt, split은 PHP 5.3에서 더 이상 사용되지 않으며 실제로 정규식을 인수로 사용하는 반면 explode는 문자열을 사용합니다. 이 경우 explode ()가 선호됩니다.
shelhamer

4
그주의 explode(".",1.10);1, 1, 1이 아닌 10 줄 줘야
미셸

답변:


177
$n = 1.25;
$whole = floor($n);      // 1
$fraction = $n - $whole; // .25

그런 다음 1/4, 1/2, 3/4 등과 비교하십시오.


음수의 경우 다음을 사용하십시오.

function NumberBreakdown($number, $returnUnsigned = false)
{
  $negative = 1;
  if ($number < 0)
  {
    $negative = -1;
    $number *= -1;
  }

  if ($returnUnsigned){
    return array(
      floor($number),
      ($number - floor($number))
    );
  }

  return array(
    floor($number) * $negative,
    ($number - floor($number)) * $negative
  );
}

$returnUnsigned하기에서 정지 -1.25를 위해서는 -1-0.25


7
측면,로 intval()이나 간단한 캐스팅 (int)보다 더 성능이 좋은 수 있습니다floor()
제이슨 맥 크리 어리

1
바닥은 네거티브를 어떻게 설명합니까?
LanceH 2011

@LanceH : 그렇지는 않지만 부정적인 플래그를 사용하면 쉽게 처리 할 수 ​​있습니다.
Brad Christie

4
이 대답은 round ()를 추가하지 않는 한 실제로 정확하지 않습니다. 멍청하게 들리지만 저수준 부동 소수점 수 산술과 관련이 있습니다. 여기를보십시오 : stackoverflow.com/questions/3726721/php-math-precision
Matt James

510.9로 시도하고 0.89를 반환합니다. 그러나 이유를 알 수 없습니다.
T30

38

이 코드는이를 분할합니다.

list($whole, $decimal) = explode('.', $your_number);

여기서 $ whole은 정수이고 $ decimal은 소수점 뒤에 자리를 갖습니다.


9
그주의 explode(".",1.10);1, 1, 1이 아닌 10 줄 줘야
미셸

3
숫자가 정수이거나 소수 부분이 포함되지 않은 경우 정의되지 않은 인덱스에 대한 경고가 중단되고 발생합니다.
Andreyco 2013

1
이것은 숫자가 문자열로 캐스트 될 때 과학적 표기법으로 표현되지 않을 것이라고 가정합니다. 정말 정말 크거나 정말 작은 숫자라면 이것은 사실이 아닐 것이고이 방법은 깨질 것입니다.
GordonM

20

그냥 다르게 :)

list($whole, $decimal) = sscanf(1.5, '%d.%d');

CodePad .

추가 이점으로 양쪽이 숫자로 구성된 경우에만 분할됩니다.


2
숫자에 소수 부분이 포함되어 있지 않으면 이것은 중단되지 않습니다. 큰!
Andreyco 2013

이것이 두 개의 정수를 출력하는 것이 좋습니다. int와 float보다는.
foochow dec

1
이것은 숫자가 문자열로 캐스트 될 때 과학적 표기법으로 표현되지 않을 것이라고 가정합니다. 정말 정말 크거나 정말 작은 숫자라면 이것은 사실이 아닐 것이고이 방법은 깨질 것입니다.
GordonM

18

floor () 메서드는 음수에 대해 작동하지 않습니다. 이것은 매번 작동합니다.

$num = 5.7;
$whole = (int) $num;  // 5
$frac  = $num - $whole;  // .7

... 음수에도 작동합니다 (동일한 코드, 다른 숫자) :

$num = -5.7;
$whole = (int) $num;  // -5
$frac  = $num - $whole;  // -.7

8

짧은 방법 (floor 및 fmod 사용)

$var = "1.25";
$whole = floor($var);     // 1
$decimal = fmod($var, 1); //0.25

그런 다음 $ decimal을 0, .25, .5 또는 .75와 비교하십시오.


나는이 대답을 받아 들인다! C #에 가깝고 (a % 1)음수를 잘 처리합니다.
Bitterblue

7

int로 캐스팅하고 빼기

$integer = (int)$your_number;
$decimal = $your_number - $integer;

또는 비교를 위해 소수를 얻으려면

$decimal = $your_number - (int)$your_number

5

사용할 수있는 fmod 함수도 있습니다. fmod ($ my_var, 1)는 동일한 결과를 반환하지만 때로는 작은 라운드 오류가 발생합니다.


3

PHP 5.4 이상

$n = 12.343;
intval($n); // 12
explode('.', number_format($n, 1))[1]; // 3
explode('.', number_format($n, 2))[1]; // 34
explode('.', number_format($n, 3))[1]; // 343
explode('.', number_format($n, 4))[1]; // 3430


1

Brad Christie의 방법은 본질적으로 정확하지만 더 간결하게 작성할 수 있습니다.

function extractFraction ($value) 
{
    $fraction   = $value - floor ($value);
    if ($value < 0)
    {
        $fraction *= -1;
    }

    return $fraction;
}

이것은 그의 방법과 동일하지만 결과적으로 더 짧고 이해하기가 더 쉽습니다.



1

항상 소수점 이하 두 자리가 있다고 믿을 수 있다면 문자열 연산을 사용할 수 있습니다.

$decimal = 1.25;
substr($decimal,-2);  // returns "25" as a string

성능에 대한 생각은 없지만 내 간단한 경우에는 훨씬 낫습니다 ...


참고 : 이렇게하려면 최소한 round ($ decimal, 2); 먼저 두 자리 숫자 만 십진수로 사용하십시오. 그러나 올바른 수학을 원하거나 돈을 다루고 싶다면 이것을 사용할 수 없습니다.
Ulrik McArdle

0

여분의 부동 소수점을 방지하기 위해 (즉, 50.85-50은 0.850000000852를 제공합니다), 제 경우에는 돈 센트에 소수점 2 자리 만 필요합니다.

$n = 50.85;
$whole = intval($n);
$fraction = $n * 100 % 100;

0

실제로 달러 금액과 소수점 이하 금액을 구분하는 방법을 찾기가 어려웠습니다. 대부분 알아 낸 것 같아요. 문제가 생기면 공유하려고 생각 했어요

그래서 기본적으로...

가격이 1234.44이면 전체는 1234이고 소수는 44 또는

가격이 1234.01이면 전체는 1234이고 소수는 01 또는

가격이 1234.10이면 전체는 1234이고 소수는 10입니다.

기타 등등

$price = 1234.44;

$whole = intval($price); // 1234
$decimal1 = $price - $whole; // 0.44000000000005 uh oh! that's why it needs... (see next line)
$decimal2 = round($decimal1, 2); // 0.44 this will round off the excess numbers
$decimal = substr($decimal2, 2); // 44 this removed the first 2 characters

if ($decimal == 1) { $decimal = 10; } // Michel's warning is correct...
if ($decimal == 2) { $decimal = 20; } // if the price is 1234.10... the decimal will be 1...
if ($decimal == 3) { $decimal = 30; } // so make sure to add these rules too
if ($decimal == 4) { $decimal = 40; }
if ($decimal == 5) { $decimal = 50; }
if ($decimal == 6) { $decimal = 60; }
if ($decimal == 7) { $decimal = 70; }
if ($decimal == 8) { $decimal = 80; }
if ($decimal == 9) { $decimal = 90; }

echo 'The dollar amount is ' . $whole . ' and the decimal amount is ' . $decimal;

-1

여기서 간단한 계수는 보이지 않습니다 ...

$number         = 1.25;
$wholeAsFloat   = floor($number);   // 1.00
$wholeAsInt     = intval($number);  // 1
$decimal        = $number % 1;      // 0.25

이 경우 모두를 얻기 $wholeAs?$decimal다른에 의존하지 않습니다. (당신은 독립적으로 3 개 출력의 1이 걸릴 수 있습니다.) 내가 보여준 $wholeAsFloat하고 $wholeAsInt있기 때문에floor() 그 반환 숫자는 항상 전체 될 것입니다 비록 반환 부동 소수점 유형 번호. (결과를 유형 힌트 함수 매개 변수로 전달하는 경우 중요합니다.)

DateInterval 인스턴스 에 대해 96.25 와 같은 부동 소수점 수를 시간과 분으로 분리하여 96 시간 15 분으로 나누고 싶었습니다 . 나는 이것을 다음과 같이했다.

$interval = new \DateInterval(sprintf("PT%dH%dM", intval($hours), (($hours % 1) * 60)));

제 경우에는 몇 초도 신경 쓰지 않았습니다.


-3
val = -3.1234

fraction = abs(val - as.integer(val) ) 

2
안녕하세요, 코드를 이해하는 데 도움이되므로 코드와 함께 약간의 설명을 추가하십시오. 코드 전용 답변은 눈살을 찌푸립니다.
Bhargav Rao
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.