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


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.