Ответ 1
$x = $x - floor($x)
Простой: как вы найдете дробную часть числа с плавающей запятой в PHP? Например, если у меня значение 1,25, я хочу вернуть 0.25.
$x = $x - floor($x)
Не забывайте, что вы не можете доверять арифметике с плавающей запятой, чтобы быть на 100% точным. Если вас это волнует, вы захотите изучить функции
Если, если число отрицательное, вам нужно будет сделать это:
$x = abs($x) - floor(abs($x));
$x = fmod($x, 1);
Вот демо:
<?php
$x = 25.3333;
$x = fmod($x, 1);
var_dump($x);
Должен ouptut
double(0.3333)
Ответ, предоставленный nlucaroni, будет работать только для положительных чисел. Возможное решение, которое работает как для положительных, так и для отрицательных чисел:
$x = $x - intval($x)
Мои навыки PHP отсутствуют, но вы можете минус результат пола от исходного номера
Однако, если вы имеете дело с чем-то вроде шума perlin или другого графического представления, решение, которое было принято, является правильным. Это даст вам дробную часть от более низкого числа.
то есть:
.25
: 0 - целое число ниже, дробная часть -.25-.25
: -1 - целое число ниже, дробная часть -.75С помощью других решений вы будете повторять 0 как целое число ниже, и, что еще хуже, вы получите обратные дробные значения для всех отрицательных чисел.
Некоторые из предыдущих ответов являются частичными. Полагаю, это то, что вам нужно для решения всех ситуаций:
function getDecimalPart($floatNum) {
return abs($floatNum - intval($floatNum));
}
$decimalPart = getDecimalPart($floatNum);
Вы можете использовать функцию fmod:
$y = fmod($x, 1); //$x = 1.25 $y = 0.25
Чтобы на самом деле избежать путаницы на этой странице, это лучший ответ, который быстр и работает как для положительных, так и для отрицательных значений $ x:
$frac=($x<0) ? $x-ceil($x) : $x-floor($x);
Я выполнил тесты скорости 10 миллионов вычислений на PHP 7.2.15, и хотя оба решения дают одинаковые результаты, fmod медленнее, чем floor/ceil.
$frac=($x<0)? $x-ceil($x): $x-floor($x);
→ 490-510 мс (в зависимости от знака $ x)
$frac=fmod($x, 1);
→ 590 - 1000 мс (в зависимости от значения $ x)
Принимая во внимание, что сам фактический пустой цикл занимает 80 мс (что включено в приведенные выше временные параметры).
Тестовый скрипт:
$x=sqrt(2)-0.41421356237;
$time_start = microtime(true);
for ($i=0;$i<=9999999;$i++) {
//$frac=fmod($x, 1); // version a
$frac=($x<0) ? $x-ceil($x) : $x-floor($x); // version b
}
$time_end = microtime(true);
$time = $time_end - $time_start;