숫자의 정수와 십진수를 구하는 방법은?
예를 들어 1.25로 지정하면 이 숫자의 "1"과 "25" 부분을 얻으려면 어떻게 해야 합니까?
소수점이 .0, .25, .5 또는 .75인지 확인해야 합니다.
$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로 만드는 것을 막습니다.
이 코드는 다음과 같이 분할됩니다.
list($whole, $decimal) = explode('.', $your_number);
여기서 $disc는 정수이고 $disc는 소수점 뒤에 숫자가 있습니다.
floor() 메서드는 음수에는 사용할 수 없습니다.이것은 항상 유효합니다.
$num = 5.7;
$whole = (int) $num; // 5
$frac = $num - $whole; // .7
...음수(같은 코드, 다른 번호)에도 대응합니다.
$num = -5.7;
$whole = (int) $num; // -5
$frac = $num - $whole; // -.7
다른 점이 있다면:)
list($whole, $decimal) = sscanf(1.5, '%d.%d');
또한 양쪽이 숫자로 구성된 경우에만 분할됩니다.
지름길(바닥과 fmod를 사용)
$var = "1.25";
$whole = floor($var); // 1
$decimal = fmod($var, 1); //0.25
$190을 0, .25, .5 또는 .75와 비교합니다.
int로 던지고 뺄셈을 합니다.
$integer = (int)$your_number;
$decimal = $your_number - $integer;
또는 단지 비교를 위해 소수점을 구한다.
$decimal = $your_number - (int)$your_number
사용할 수 있는 fmod 함수도 있습니다.fmod($my_var, 1)는 같은 결과를 반환하지만 경우에 따라서는 작은 라운드 오류가 발생합니다.
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
사용하는 방법은 다음과 같습니다.
$float = 4.3;
$dec = ltrim(($float - floor($float)),"0."); // result .3
정수 부분과 십진수 부분을 두 개의 정수 구분 값으로 분할하려는 사용자를 위한 새로운 간단한 솔루션입니다.
5.25 -> 내부: 5, 소수점: 25
$num = 5.25;
$int_part = intval($num);
$dec_part = $num * 100 % 100;
이 방법은 문자열 기반 함수를 포함하지 않으며 다른 연산에서 발생할 수 있는 정확도 문제를 방지합니다(0.5가 아닌 0.49999999999999 등).
극단적 가치로 철저히 테스트하지는 않았지만, 가격 계산에는 문제가 없습니다.
하지만 조심하세요!이제 -5.25부터는 다음을 얻을 수 있습니다.정수 부분: -5, 소수 부분: -25
항상 양수를 얻고 싶은 경우, 간단히 더하면 됩니다.abs()
계산 전:
$num = -5.25;
$num = abs($num);
$int_part = intval($num);
$dec_part = $num * 100 % 100;
마지막으로 소수점 2개로 가격을 인쇄하기 위한 보너스 스니펫:
$message = sprintf("Your price: %d.%02d Eur", $int_part, $dec_part);
5.05가 아닌 5.5가 되는 것을 피하기 위해 ;)
Brad Christie의 방법은 본질적으로 옳지만 좀 더 간결하게 쓸 수 있다.
function extractFraction ($value)
{
$fraction = $value - floor ($value);
if ($value < 0)
{
$fraction *= -1;
}
return $fraction;
}
이것은 그의 방법과 동일하지만 결과적으로 더 짧고 이해하기 쉬울 것이다.
나는 실제로 달러 금액과 소수점 이후의 금액을 구분하는 방법을 찾느라 애를 먹었다.내가 가장 많이 알아냈던 것 같아 그리고 너희 중 누구라도 문제가 있다면
그러니까 기본적으로...
만약 가격이 1234.44라면... 전체는 1234이고 소수점은 44일 것입니다.
가격이 1234.01이면...전체는 1234이고 10진수는 01이거나
가격이 1234.10이면...전체는 1234이고 10진수는 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;
$x = 1.24
$result = $x - floor($x);
echo $result; // .24
항상 소수점 이하 2자리만 사용할 수 있다면 문자열 연산만 사용할 수 있습니다.
$decimal = 1.25;
substr($decimal,-2); // returns "25" as a string
퍼포먼스에 대한 생각은 없었지만, 제 경우는 이게 훨씬 더 나았습니다.
추가 부동 소수점(50.85 - 50 = 0.850000000852)을 방지하기 위해, 제 경우 돈센트에 소수점 2개만 있으면 됩니다.
$n = 50.85;
$whole = intval($n);
$fraction = $n * 100 % 100;
이렇게 해봐...이렇게 하면 더 쉽다
$var = "0.98";
$decimal = strrchr($var,".");
$whole_no = $var-$decimal;
echo $whole_no;
echo str_replace(".", "", $decimal);
다음과 같은 것도 사용할 수 있습니다.
preg_match("/([0-9]+)\.([0-9]+)/", $number, $matches);
캐스트 으로 하는 는, 「」를 .sscanf()
훌륭한 결정입니다.
코드: (데모)
var_dump(sscanf(1.25, '%d%f'));
출력:
array(2) {
[0]=>
int(1)
[1]=>
float(0.25)
}
또는 다음 두 변수를 개별적으로 할당할 수도 있습니다.
sscanf(1.25, '%d%f', $int, $float);
var_dump($int);
var_dump($float);
소수점 부분을 플로트로 주조하는 것은, 예를 들면 시간의 십진법을 시간과 분으로 변환할 때 특히 유용합니다.(데모)
$decimalTimes = [
6,
7.2,
8.78,
];
foreach ($decimalTimes as $decimalTime) {
sscanf($decimalTime, '%d%f', $hours, $minutes);
printf('%dh%02dm', $hours, round($minutes * 60));
echo "\n";
}
출력:
6h00m
7h12m
8h47m // if round() was not used, this would be 8h46m
단순한 계수를 볼 수 없습니다...
$number = 1.25;
$wholeAsFloat = floor($number); // 1.00
$wholeAsInt = intval($number); // 1
$decimal = $number % 1; // 0.25
둘 다 수 있습니다.$wholeAs?
★★★★★★★★★★★★★★★★★」$decimal
다른 출력에 의존하지 마십시오. (3개의 출력 중 하나만 독립적으로 얻을 수 있습니다.)$wholeAsFloat
★★★★★★★★★★★★★★★★★」$wholeAsInt
왜냐하면 float type number를 반환하기 때문에 반환되는 숫자는 항상 정수입니다(이것은 결과를 type-hint 함수의 파라미터로 전달하는 경우에 중요합니다).
DateInterval 인스턴스에 대해 96.25와 같은 부동 소수점 수를 96시간 15분으로 시간과 분 단위로 분할하려고 했습니다.이 작업을 다음과 같이.
$interval = new \DateInterval(sprintf("PT%dH%dM", intval($hours), (($hours % 1) * 60)));
내 경우에는 몇 초라도 상관하지 않았다.
val = -3.1234
fraction = abs(val - as.integer(val) )
언급URL : https://stackoverflow.com/questions/6619377/how-to-get-whole-and-decimal-part-of-a-number
'programing' 카테고리의 다른 글
연결된 테이블에서 아이들의 총 레코드를 가져옵니다. (0) | 2022.09.29 |
---|---|
Mac OS X에 MySQLdb(Python Data Access Library to MySQL)를 설치하는 방법 (0) | 2022.09.29 |
Python에서 현재 날짜와 시간으로 파일 이름을 만드는 방법은 무엇입니까? (0) | 2022.09.29 |
특정 컬럼의 값이 NaN인 Panda DataFrame 행을 삭제하는 방법 (0) | 2022.09.29 |
JPA/Hibernate에서의 flash()의 올바른 사용 (0) | 2022.09.29 |