Será que uma simples explosão funcionará? $ splitDec = explode (".", $ decimal); $ splitDec [0] agora será 1 e splitDec [1] agora será 25 de seu exemplo.
Matt
@Matt split()foi preterido.
alex
@alex sim, esqueci. Estava pensando em javascript. alterado para explodir.
Matt
@Matt, split foi descontinuado a partir do PHP 5.3 e, na verdade, leva um regex como argumento, enquanto explodir leva uma string. explode () é o preferido neste caso.
shelhamer
4
Esteja ciente de que explode(".",1.10);darei 1 e 1, não 1 e 10
Como um lado, intval()ou elenco simples (int)pode ter mais desempenho do quefloor()
Jason McCreary
1
Como o piso contabiliza os negativos?
LanceH
@LanceH: Não, mas você pode lidar com isso facilmente com um sinalizador negativo.
Brad Christie
4
Esta resposta é realmente imprecisa, a menos que você adicione uma rodada (). Parece idiota, eu sei, mas tem a ver com aritmética de número de ponto flutuante de baixo nível. Veja aqui: stackoverflow.com/questions/3726721/php-math-precision
Matt James
Tente com 510,9, retorna 0,89. Mas não posso dizer por quê.
Esteja ciente de que explode(".",1.10);darei 1 e 1, não 1 e 10
Michel
3
Isso interrompe e lança um aviso sobre o índice indefinido, se o número for inteiro ou não contiver parte decimal.
Andreyco
1
Isso pressupõe que o número não acabará sendo representado em notação científica quando convertido em string. Se for um número realmente muito grande ou muito pequeno, então esse não será o caso e esse método falhará.
Este não quebra se o número não contém parte decimal. Ótimo!
Andreyco
É bom que isso produza dois inteiros; em vez de um int e um float.
foochow de
1
Isso pressupõe que o número não acabará sendo representado em notação científica quando convertido em string. Se for um número realmente muito grande ou muito pequeno, então esse não será o caso e esse método falhará.
GordonM
18
O método floor () não funciona para números negativos. Isso sempre funciona:
Nota: se você fizer isso, você deve pelo menos usar round ($ decimal, 2); primeiro, para garantir que você tenha apenas dois dígitos decimais. Mas você não pode usar isso se quiser ter matemática correta ou lidar com dinheiro.
Ulrik McArdle
0
Para evitar o decimal flutuante extra (ou seja, 50,85 - 50 dê 0,850000000852), no meu caso, preciso apenas de 2 decimais para centavos monetários.
Eu estava tendo dificuldade em encontrar uma maneira de separar o valor em dólares do valor após a casa decimal. Acho que descobri principalmente e pensei em compartilhar se algum de vocês estava tendo problemas
Então, basicamente...
se o preço for 1234,44 ... todo seria 1234 e o decimal seria 44 ou
se o preço for 1234,01 ... todo seria 1234 e o decimal seria 01 ou
se o preço for 1234,10 ... o todo seria 1234 e o decimal seria 10
e assim por diante
$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;
Nesse caso, obter os dois $wholeAs?e $decimalnão depender do outro. (Você pode pegar 1 das 3 saídas independentemente.) Eu mostrei $wholeAsFloate $wholeAsIntporquefloor() retorna um número do tipo flutuante, embora o número que ele retorna seja sempre inteiro. (Isso é importante se você estiver passando o resultado para um parâmetro de função com dica de tipo.)
Eu queria que isso dividisse um número de ponto flutuante de horas / minutos, por exemplo, 96,25, em horas e minutos separadamente para uma instância DateInterval como 96 horas e 15 minutos. Eu fiz isso da seguinte maneira:
split()
foi preterido.explode(".",1.10);
darei 1 e 1, não 1 e 10Respostas:
Em seguida, compare com 1/4, 1/2, 3/4, etc.
Em casos de números negativos, use o seguinte:
O
$returnUnsigned
pára-lo de fazer -1.25 para -1 & -0.25fonte
intval()
ou elenco simples(int)
pode ter mais desempenho do quefloor()
Este código irá dividi-lo para você:
onde $ inteiro é o número inteiro e $ decimal terá os dígitos após o ponto decimal.
fonte
explode(".",1.10);
darei 1 e 1, não 1 e 10Só para ser diferente :)
CodePad .
Como um benefício adicional, ele só será dividido quando os dois lados consistirem em dígitos.
fonte
O método floor () não funciona para números negativos. Isso sempre funciona:
... também funciona para negativos (mesmo código, número diferente):
fonte
um caminho curto (use floor e fmod)
em seguida, compare $ decimal com 0, 0,25, 0,5 ou 0,75
fonte
(a % 1)
e trata bem os números negativos.Lance como um int e subtraia
Ou apenas para obter o decimal para comparação
fonte
Também existe uma função fmod que pode ser usada: fmod ($ my_var, 1) retornará o mesmo resultado, mas às vezes com um pequeno erro de arredondamento.
fonte
PHP 5.4+
fonte
Esta é a maneira que eu uso:
fonte
O método de Brad Christie é essencialmente correto, mas pode ser escrito de forma mais concisa.
Isso é equivalente ao seu método, mas mais curto e, felizmente, mais fácil de entender como resultado.
fonte
fonte
Se você pode contar com sempre 2 casas decimais, você pode apenas usar uma operação de string:
Nenhuma ideia de desempenho, mas para o meu caso simples, isso era muito melhor ...
fonte
Para evitar o decimal flutuante extra (ou seja, 50,85 - 50 dê 0,850000000852), no meu caso, preciso apenas de 2 decimais para centavos monetários.
fonte
Eu estava tendo dificuldade em encontrar uma maneira de separar o valor em dólares do valor após a casa decimal. Acho que descobri principalmente e pensei em compartilhar se algum de vocês estava tendo problemas
Então, basicamente...
se o preço for 1234,44 ... todo seria 1234 e o decimal seria 44 ou
se o preço for 1234,01 ... todo seria 1234 e o decimal seria 01 ou
se o preço for 1234,10 ... o todo seria 1234 e o decimal seria 10
e assim por diante
fonte
Não vi um módulo simples aqui ...
Nesse caso, obter os dois
$wholeAs?
e$decimal
não depender do outro. (Você pode pegar 1 das 3 saídas independentemente.) Eu mostrei$wholeAsFloat
e$wholeAsInt
porquefloor()
retorna um número do tipo flutuante, embora o número que ele retorna seja sempre inteiro. (Isso é importante se você estiver passando o resultado para um parâmetro de função com dica de tipo.)Eu queria que isso dividisse um número de ponto flutuante de horas / minutos, por exemplo, 96,25, em horas e minutos separadamente para uma instância DateInterval como 96 horas e 15 minutos. Eu fiz isso da seguinte maneira:
Eu não me importei com segundos no meu caso.
fonte
fonte