Dado, digamos, 1,25 - ¿cómo obtengo "1" y "25" partes de este número?
Necesito verificar si la parte decimal es .0, .25, .5 o .75.
split()
ha quedado obsoleto.
explode(".",1.10);
daré 1 y 1, no 1 y 10
Dado, digamos, 1,25 - ¿cómo obtengo "1" y "25" partes de este número?
Necesito verificar si la parte decimal es .0, .25, .5 o .75.
split()
ha quedado obsoleto.
explode(".",1.10);
daré 1 y 1, no 1 y 10
Respuestas:
$n = 1.25;
$whole = floor($n); // 1
$fraction = $n - $whole; // .25
Luego compare con 1/4, 1/2, 3/4, etc.
En casos de números negativos, use esto:
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
);
}
El $returnUnsigned
lo para de hacer -1,25 a -1 y -0,25
intval()
o un elenco simple, ya que (int)
podría ser más eficaz quefloor()
Este código lo dividirá por ti:
list($whole, $decimal) = explode('.', $your_number);
donde $ entero es el número entero y $ decimal tendrá los dígitos después del punto decimal.
explode(".",1.10);
daré 1 y 1, no 1 y 10
Solo para ser diferente :)
list($whole, $decimal) = sscanf(1.5, '%d.%d');
CodePad .
Como beneficio adicional, solo se dividirá cuando ambos lados estén formados por dígitos.
un camino corto (use floor y fmod)
$var = "1.25";
$whole = floor($var); // 1
$decimal = fmod($var, 1); //0.25
luego compare $ decimal con 0, .25, .5 o .75
(a % 1)
y maneja bien los números negativos.
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
Esta es la forma que uso:
$float = 4.3;
$dec = ltrim(($float - floor($float)),"0."); // result .3
El método de Brad Christie es esencialmente correcto, pero se puede escribir de manera más concisa.
function extractFraction ($value)
{
$fraction = $value - floor ($value);
if ($value < 0)
{
$fraction *= -1;
}
return $fraction;
}
Esto es equivalente a su método, pero más corto y, con suerte, más fácil de entender como resultado.
Si puede contar con que siempre tendrá 2 lugares decimales, puede usar una operación de cadena:
$decimal = 1.25;
substr($decimal,-2); // returns "25" as a string
No tengo idea de rendimiento, pero para mi caso simple, esto fue mucho mejor ...
Estaba teniendo dificultades para encontrar una manera de separar realmente la cantidad en dólares y la cantidad después del decimal. Creo que lo descubrí principalmente y pensé en compartir si alguno de ustedes tenía problemas.
Así que básicamente...
si el precio es 1234,44 ... el total sería 1234 y el decimal sería 44 o
si el precio es 1234.01 ... el total sería 1234 y el decimal sería 01 o
si el precio es 1234.10 ... todo sería 1234 y decimal sería 10
Etcétera
$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;
No he visto un módulo simple aquí ...
$number = 1.25;
$wholeAsFloat = floor($number); // 1.00
$wholeAsInt = intval($number); // 1
$decimal = $number % 1; // 0.25
En este caso conseguir ambos $wholeAs?
y $decimal
no depender del otro. (Puede tomar 1 de las 3 salidas de forma independiente). He mostrado $wholeAsFloat
y $wholeAsInt
porquefloor()
devuelve un número de tipo flotante aunque el número que devuelve siempre será entero. (Esto es importante si está pasando el resultado a un parámetro de función con sugerencia de tipo).
Quería que esto dividiera un número de punto flotante de horas / minutos, por ejemplo, 96,25, en horas y minutos por separado para una instancia de DateInterval como 96 horas y 15 minutos. Hice esto de la siguiente manera:
$interval = new \DateInterval(sprintf("PT%dH%dM", intval($hours), (($hours % 1) * 60)));
En mi caso, no me importaban los segundos.
val = -3.1234
fraction = abs(val - as.integer(val) )