Враховуючи, скажімо, 1,25 - як я можу отримати частини "1" та "25" від цього числа?
Мені потрібно перевірити, чи є десяткова частина .0, .25, .5 або .75.
split()
застарілий.
explode(".",1.10);
дадуть 1 і 1, а не 1 і 10
Враховуючи, скажімо, 1,25 - як я можу отримати частини "1" та "25" від цього числа?
Мені потрібно перевірити, чи є десяткова частина .0, .25, .5 або .75.
split()
застарілий.
explode(".",1.10);
дадуть 1 і 1, а не 1 і 10
Відповіді:
$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
intval()
або простий кастинг, який (int)
може бути більш ефективним, ніжfloor()
Цей код розділить його на вас:
list($whole, $decimal) = explode('.', $your_number);
де $ whole - це ціле число, а $ decimal буде після цифр після коми.
explode(".",1.10);
дадуть 1 і 1, а не 1 і 10
Просто щоб бути іншим :)
list($whole, $decimal) = sscanf(1.5, '%d.%d');
CodePad .
В якості додаткової переваги він розділиться лише там, де обидві сторони складаються з цифр.
короткий шлях (використовувати підлогу та fmod)
$var = "1.25";
$whole = floor($var); // 1
$decimal = fmod($var, 1); //0.25
потім порівняйте $ десятковий з 0, .25, .5 або .75
(a % 1)
І добре обробляє негативні числа.
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
Я використовую такий спосіб:
$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;
}
Це еквівалентно його методу, але коротший і, сподіваємось, простіше зрозуміти як результат.
Якщо ви можете розраховувати, що він завжди матиме два десяткових знаки, ви можете просто скористатися рядковою операцією:
$decimal = 1.25;
substr($decimal,-2); // returns "25" as a string
Поняття про продуктивність не маю, але для мого простого випадку це було набагато краще ...
Мені важко було знайти спосіб фактично розділити суму долара та суму після десяткової. Я думаю, що я зрозумів це здебільшого і подумав поділитися, якщо у когось із жовних виникли проблеми
Так в основному ...
якщо ціна - 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;
Тут не бачили простого модуля ...
$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)));
Мені не було байдуже секунд у моєму випадку.
val = -3.1234
fraction = abs(val - as.integer(val) )