Простой: как вы найдете дробную часть числа с плавающей запятой в PHP? Например, если у меня значение 1,25, я хочу вернуть 0.25.
Какой лучший способ получить дробную часть float в PHP?
Ответ 1
$x = $x - floor($x)
Ответ 2
Не забывайте, что вы не можете доверять арифметике с плавающей запятой, чтобы быть на 100% точным. Если вас это волнует, вы захотите изучить функции
Ответ 3
Если, если число отрицательное, вам нужно будет сделать это:
$x = abs($x) - floor(abs($x));
Ответ 4
$x = fmod($x, 1);
Вот демо:
<?php
$x = 25.3333;
$x = fmod($x, 1);
var_dump($x);
Должен ouptut
double(0.3333)
Ответ 5
Ответ, предоставленный nlucaroni, будет работать только для положительных чисел. Возможное решение, которое работает как для положительных, так и для отрицательных чисел:
$x = $x - intval($x)
Ответ 6
Мои навыки PHP отсутствуют, но вы можете минус результат пола от исходного номера
Ответ 7
Однако, если вы имеете дело с чем-то вроде шума perlin или другого графического представления, решение, которое было принято, является правильным. Это даст вам дробную часть от более низкого числа.
то есть:
-
.25
: 0 - целое число ниже, дробная часть -.25 -
-.25
: -1 - целое число ниже, дробная часть -.75
С помощью других решений вы будете повторять 0 как целое число ниже, и, что еще хуже, вы получите обратные дробные значения для всех отрицательных чисел.
Ответ 8
Некоторые из предыдущих ответов являются частичными. Полагаю, это то, что вам нужно для решения всех ситуаций:
function getDecimalPart($floatNum) {
return abs($floatNum - intval($floatNum));
}
$decimalPart = getDecimalPart($floatNum);
Ответ 9
Вы можете использовать функцию fmod:
$y = fmod($x, 1); //$x = 1.25 $y = 0.25
Ответ 10
Чтобы на самом деле избежать путаницы на этой странице, это лучший ответ, который быстр и работает как для положительных, так и для отрицательных значений $ 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;