Учитывая, скажем, 1,25 – как мне получить «1» и «25» частей этого номера?
Мне нужно проверить, есть ли десятичная часть .0, .25, .5 или .75.
$n = 1.25; $whole = floor($n); // 1 $fraction = $n - $whole; // .25
Затем сравните с 1/4, 1/2, 3/4 и т. Д.
В случае отрицательных чисел используйте следующее:
function NumberBreakdown($number, $returnUnsigned = false) { $negative = 1; if ($number < 0) { $negative = -1; $number *= -1; } if ($returnUnsigned){ return array( floor($number), ($number - floor($number)) ); } return array( floor($number) * $negative, ($number - floor($number)) * $negative ); }
$returnUnsigned
останавливает его от создания -1.25 в -1 и -0.25
Этот код разделит его на вас:
list($whole, $decimal) = explode('.', $your_number);
где $ whole – целое число, а $ decimal – цифры после десятичной точки.
Просто быть разными 🙂
list($whole, $decimal) = sscanf(1.5, '%d.%d');
CodePad .
В качестве дополнительной выгоды он будет только разбиваться, когда обе стороны состоят из цифр.
Метод floor () не работает для отрицательных чисел. Это работает каждый раз:
$num = 5.7; $whole = (int) $num; // 5 $frac = $num - (int) $num; // .7
… также работает для негативов (тот же код, другой номер):
$num = -5.7; $whole = (int) $num; // -5 $frac = $num - (int) $num; // -.7
Также есть функция fmod, которая может быть использована: fmod ($ my_var, 1) вернет тот же результат, но когда-нибудь с небольшой округлой ошибкой.
Передайте его как int и вычтите
$integer = (int)$your_number; $decimal = $whole - $integer;
Или просто получить десятичное значение для сравнения
$decimal = $your_number - (int)$your_number
короткий (используйте пол и fmod)
$var = "1.25"; $whole = floor($var); // 1 $decimal = fmod($var, 1); //0.25
затем сравните $ decimal с 0, .25, .5 или .75
Именно так я использую:
$float = 4.3; $dec = ltrim(($float - floor($float)),"0."); // result .3
Метод Брэда Кристи, по сути, правильный, но его можно написать более кратко.
function extractFraction ($value) { $fraction = $value - floor ($value); if ($value < 0) { $fraction *= -1; } return $fraction; }
Это эквивалентно его методу, но короче и, надеюсь, легче понять в результате.
Чтобы предотвратить дополнительный поплавок десятичной (то есть 50,85 – 50 дают 0,850000000852), в моем случае мне просто нужно 2 десятичных знака за денежные центы.
$n = 50.85; $whole = intval($n); $fraction = $n * 100 % 100;
PHP 5.4+
$n = 12.343; intval($n); // 12 explode('.', number_format($n, 1))[1]; // 3 explode('.', number_format($n, 2))[1]; // 34 explode('.', number_format($n, 3))[1]; // 343 explode('.', number_format($n, 4))[1]; // 3430
Мне было трудно найти способ фактически отделить сумму доллара и сумму после десятичной. Я думаю, что я понял это в основном и думал делиться, если у кого-нибудь из вас были проблемы
Итак, в основном …
если цена 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;
val = -3.1234 fraction = abs(val - as.integer(val) )