Какой лучший способ получить дробную часть числа с плавающей точкой в ​​PHP? - PullRequest
47 голосов
/ 09 сентября 2008

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

Ответы [ 10 ]

71 голосов
/ 09 сентября 2008
$x = $x - floor($x)
14 голосов
/ 09 сентября 2008

Не забывайте, что вы не можете доверять арифметике с плавающей запятой, чтобы быть точной на 100%. Если вас это беспокоит, вам нужно изучить функции BCMath Arbitrary Precision Matmatics .

$x = 22.732423423423432;
$x = bcsub(abs($x),floor(abs($x)),20);

Вы также можете взломать строку самостоятельно

$x = 22.732423423423432;    
$x = strstr ( $x, '.' );
9 голосов
/ 13 января 2017
$x = fmod($x, 1);

Вот демоверсия:

<?php
$x = 25.3333;
$x = fmod($x, 1);
var_dump($x);

Должен выйти

double(0.3333)

Кредит.

9 голосов
/ 09 сентября 2008

Если число отрицательное, вам придется сделать следующее:

 $x = abs($x) - floor(abs($x));
8 голосов
/ 12 октября 2011

Ответ, предоставленный nlucaroni, будет работать только для положительных чисел. Возможное решение, которое работает как для положительных, так и для отрицательных чисел:

$x = $x - intval($x)
3 голосов
/ 09 сентября 2008

Мне не хватает навыков в PHP, но вы можете вычесть минус результат из исходного числа

1 голос
/ 01 августа 2016

Некоторые из предыдущих ответов являются частичными. Я считаю, что это то, что вам нужно для обработки всех ситуаций:

function getDecimalPart($floatNum) {
    return abs($floatNum - intval($floatNum));
}

$decimalPart = getDecimalPart($floatNum);
1 голос
/ 11 декабря 2011

Однако, если вы имеете дело с чем-то вроде перлин-шума или другого графического представления, решение, которое было принято, является правильным. Это даст вам дробную часть от нижнего числа.

т.е:

  • .25: 0 - целое число ниже, дробная часть - .25
  • -.25: -1 - целое число ниже, дробная часть - .75

С другими решениями вы будете повторять 0 как целое число ниже, и что еще хуже, вы получите обратные дробные значения для всех отрицательных чисел.

0 голосов
/ 22 мая 2019

Чтобы избежать путаницы на этой странице, на самом деле это лучший ответ, который быстр и работает как для положительных, так и для отрицательных значений $ 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;
0 голосов
/ 07 февраля 2019

Вы можете использовать функцию fmod :

$y = fmod($x, 1); //$x = 1.25 $y = 0.25
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...