Учитывая, скажем, 1.25 - как мне получить "1" и "25" частей этого числа?
Мне нужно проверить, есть ли десятичная часть .0,.25,.5 или .75.
Учитывая, скажем, 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);
где $whole - это целое число, а $decimal - цифры после десятичной точки.
Просто чтобы быть другим:)
list($whole, $decimal) = sscanf(1.5, '%d.%d');
В качестве дополнительного преимущества он будет только разбиваться, когда обе стороны состоят из цифр.
Метод floor() не работает для отрицательных чисел. Это работает каждый раз:
$num = 5.7;
$whole = (int) $num;  // 5
$frac  = $num - (int) $num;  // .7
... также работает для негативов (тот же код, другое число):
$num = -5.7;
$whole = (int) $num;  // -5
$frac  = $num - (int) $num;  // -.7
		Приведите это как int и вычтите
$integer = (int)$your_number;
$decimal = $your_number - $integer;
Или просто получить десятичное число для сравнения
$decimal = $your_number - (int)$your_number
		короткий путь (используйте пол и fmod)
$var = "1.25";
$whole = floor($var);     // 1
$decimal = fmod($var, 1); //0.25
затем сравните $decimal с 0,.25,.5 или .75
Также есть функция 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
		Метод Брэда Кристи, по сути, правильный, но его можно написать более кратко.
function extractFraction ($value) 
{
    $fraction   = $value - floor ($value);
    if ($value < 0)
    {
        $fraction *= -1;
    }
    return $fraction;
}
Это эквивалентно его методу, но короче и, надеюсь, легче понять в результате.
$x = 1.24
$result = $x - floor($x);
echo $result; // .24
		Чтобы предотвратить добавление поплавкового десятичного числа (то есть 50.85 - 50 дают 0.850000000852), в моем случае мне просто нужно 2 десятичных знака за денежные центы.
$n = 50.85;
$whole = intval($n);
$fraction = $n * 100 % 100;
		Мне было трудно найти способ фактически отделить сумму доллара и сумму после десятичной. Я думаю, что я понял это в основном и думал делиться, если какой-либо из yall имел проблемы.
Итак, в основном...
если цена равна 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 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 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;
		Если вы можете рассчитывать на то, что он всегда имеет 2 десятичных знака, вы можете просто использовать строковую операцию:
$decimal = 1.25;
substr($decimal,-2);  // returns "25" as a string
Не знаю производительности, но для моего простого случая это было намного лучше...
Здесь не виден простой модуль...
$number         = 1.25;
$wholeAsFloat   = floor($number);   // 1.00
$wholeAsInt     = intval($number);  // 1
$decimal        = $number % 1;      // 0.25
  В этом случае получить оба $wholeAs? и $decimal не зависят от другого. (Вы можете просто взять 1 из 3 выходных данных независимо.) Я показал $wholeAsFloat и $wholeAsInt потому что  floor() возвращает число типа с плавающей запятой, даже если возвращаемое число всегда будет целым. (Это важно, если вы передаете результат в параметр функции с подсказкой типа.)
Я хотел, чтобы это делило число часов/минут с плавающей запятой, например 96,25, на часы и минуты отдельно для экземпляра DateInterval как 96 часов 15 минут. Я сделал это следующим образом:
$interval = new \DateInterval(sprintf("PT%dH%dM", intval($hours), (($hours % 1) * 60)));
 Меня не волновали секунды в моем случае.
val = -3.1234
fraction = abs(val - as.integer(val) )