¿Funcionará una simple explosión? $ splitDec = explotar (".", $ decimal); $ splitDec [0] ahora será el 1 y splitDec [1] ahora será el 25 de su ejemplo.
Matt
@Matt split()ha quedado obsoleto.
alex
@alex sí, lo olvidé. Estaba pensando en javascript. cambiado para explotar.
Matt
@Matt, split ha quedado obsoleto a partir de PHP 5.3 y en realidad toma una expresión regular como argumento, mientras que explotar toma una cadena. En este caso, se prefiere explotar ().
shelhamer
4
Tenga en cuenta que explode(".",1.10);daré 1 y 1, no 1 y 10
Como un lado, intval()o un elenco simple, ya que (int)podría ser más eficaz quefloor()
Jason McCreary
1
¿Cómo explica el suelo los negativos?
LanceH
@LanceH: No es así, pero puedes hacer que lo maneje con bastante facilidad con una bandera negativa.
Brad Christie
4
Esta respuesta es realmente inexacta a menos que agregue una ronda (). Suena tonto, lo sé, pero tiene que ver con la aritmética de números de punto flotante de bajo nivel. Vea aquí: stackoverflow.com/questions/3726721/php-math-precision
Matt James
Pruebe con 510,9, devuelve 0,89. Pero no puedo decir por qué.
Tenga en cuenta que explode(".",1.10);daré 1 y 1, no 1 y 10
Michel
3
Esto se rompe y arroja una advertencia sobre el índice indefinido, si el número es un entero o no contiene una parte decimal.
Andreyco
1
Esto supone que el número no va a terminar representado en notación científica cuando se convierte en cadena. Si es un número realmente muy grande o realmente muy pequeño, este no será el caso y este método se romperá.
Éste no se rompe si el número no contiene una parte decimal. ¡Excelente!
Andreyco
Es bueno que esto genere dos enteros; en lugar de int y float.
foochow
1
Esto supone que el número no va a terminar representado en notación científica cuando se convierte en cadena. Si es un número realmente grande o muy pequeño, entonces este no será el caso y este método se romperá.
GordonM
18
El método floor () no funciona con números negativos. Esto funciona siempre:
Nota: si hace esto, al menos debería usar round ($ decimal, 2); primero para asegurarse de que solo tiene dos dígitos como decimal. Pero no puede usar esto si desea tener las matemáticas correctas o manejar el dinero.
Ulrik McArdle
0
Para evitar el decimal flotante adicional (es decir, 50.85 - 50 dan 0.850000000852), en mi caso solo necesito 2 decimales para centavos de dinero.
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 charactersif($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 tooif($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;
En este caso conseguir ambos $wholeAs?y $decimalno depender del otro. (Puede tomar 1 de las 3 salidas de forma independiente). He mostrado $wholeAsFloaty $wholeAsIntporquefloor() 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:
split()
ha quedado obsoleto.explode(".",1.10);
daré 1 y 1, no 1 y 10Respuestas:
Luego compare con 1/4, 1/2, 3/4, etc.
En casos de números negativos, use esto:
El
$returnUnsigned
lo para de hacer -1,25 a -1 y -0,25fuente
intval()
o un elenco simple, ya que(int)
podría ser más eficaz quefloor()
Este código lo dividirá por ti:
donde $ entero es el número entero y $ decimal tendrá los dígitos después del punto decimal.
fuente
explode(".",1.10);
daré 1 y 1, no 1 y 10Solo para ser diferente :)
CodePad .
Como beneficio adicional, solo se dividirá cuando ambos lados estén formados por dígitos.
fuente
El método floor () no funciona con números negativos. Esto funciona siempre:
... también funciona para negativos (mismo código, número diferente):
fuente
un camino corto (use floor y fmod)
luego compare $ decimal con 0, .25, .5 o .75
fuente
(a % 1)
y maneja bien los números negativos.Lanzarlo como un int y restar
O simplemente para obtener el decimal para comparar
fuente
También hay una función fmod que se puede usar: fmod ($ my_var, 1) devolverá el mismo resultado, pero en algún momento con un pequeño error redondo.
fuente
PHP 5.4+
fuente
Esta es la forma que uso:
fuente
El método de Brad Christie es esencialmente correcto, pero se puede escribir de manera más concisa.
Esto es equivalente a su método, pero más corto y, con suerte, más fácil de entender como resultado.
fuente
fuente
Si puede contar con que siempre tendrá 2 lugares decimales, puede usar una operación de cadena:
No tengo idea de rendimiento, pero para mi caso simple, esto fue mucho mejor ...
fuente
Para evitar el decimal flotante adicional (es decir, 50.85 - 50 dan 0.850000000852), en mi caso solo necesito 2 decimales para centavos de dinero.
fuente
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
fuente
No he visto un módulo simple aquí ...
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:
En mi caso, no me importaban los segundos.
fuente
fuente