Как получить целую и десятичную часть числа? - PullRequest
86 голосов
/ 08 июля 2011

Учитывая, скажем, 1,25 - как мне получить «1» и «25» частей этого числа?

Мне нужно проверить, является ли десятичная часть .0, .25, .5 или .75.

Ответы [ 16 ]

1 голос
/ 04 октября 2015

Метод Брэда Кристи, по сути, правильный, но его можно написать более кратко.

function extractFraction ($value) 
{
    $fraction   = $value - floor ($value);
    if ($value < 0)
    {
        $fraction *= -1;
    }

    return $fraction;
}

Это эквивалентно его методу, но короче и, как мы надеемся, в результате легче понять.

0 голосов
/ 24 марта 2019

Если вы можете рассчитывать на то, что он всегда имеет 2 десятичных знака, вы можете просто использовать строковую операцию:

$decimal = 1.25;
substr($decimal,-2);  // returns "25" as a string

Нет представления о производительности, но для моего простого случая это было намного лучше ...

0 голосов
/ 05 февраля 2019

Здесь не виден простой модуль ...

$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)));

Меня не волновали секунды в моем случае.

0 голосов
/ 07 октября 2017

Мне было трудно найти способ фактически разделить сумму в долларах и после десятичной дроби. Я думаю, что я понял это главным образом и думал поделиться, если у любого из 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's 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's 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;
0 голосов
/ 01 сентября 2016

Для предотвращения дополнительного десятичного числа с плавающей точкой (т. Е. 50,85 - 50 дают 0,850000000852), в моем случае мне просто нужно 2 десятичных знака для денежных центов.

$n = 50.85;
$whole = intval($n);
$fraction = $n * 100 % 100;
0 голосов
/ 10 января 2016
val = -3.1234

fraction = abs(val - as.integer(val) ) 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...