Подтвердить что ты не робот

Какой лучший способ получить дробную часть float в PHP?

Простой: как вы найдете дробную часть числа с плавающей запятой в PHP? Например, если у меня значение 1,25, я хочу вернуть 0.25.

4b9b3361

Ответ 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;