Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Oi pessoal, as vezes me pergunto, será que o óbvio é de fato obvio?
Não sou loira mas tem algo errado:
$precototal = "$precounitario * $totalemitido";
Nos valores recuperados tenho tenho:
**precototal: 0.002822102460892938**
**totalemitido: 10,454,760.506412**
Perceba que ambos numeros estão em formato USD
O que eu esperava era o resultado: **29,503.334149**
O que recebo?: 0.0002822
Será macumba ou estou longe de acertar com a formula proposta?Olá @biakelly, você está quase lá...
1 - Precisa retirar as vírgulas, os pontos representam os decimais e precisam estar na conta. Portanto:
// Primeiro retiramos a vírgula com o str_replace.
// O (float) força o tipo de variável a ser um float, ou seja, número com decimais.
// Se price fosse originalmente '424,123.123', isso significa que era uma string
// com vírgulas representando os milhares.
$price = (float)str_replace( ',', '', $price);// Agora passaria a ser 424123.123
Você faz o mesmo com a outra variável, multiplica uma pela outra e aplica o number_format.
Não precisa da divisão por 10000000000...
O único problema é que como são números muito grandes, talvez você precise de uma biblioteca para lidar com a precisão dessa matemática, como fiz naquele exemplo da soma da API, para você, sabe?
Nesse caso a matemática seria algo assim:
<?php
$precototal = '0.002822102460892938';
$totalemitido = '10,454,760.506412';
$precototal = str_replace( ',', '', $precototal );
$totalemitido = str_replace( ',', '', $totalemitido );
echo $precototal . "\n";
echo $totalemitido . "\n";
echo bcmul( $precototal, $totalemitido, 10 );
Resultado:
0.002822102460892938
10454760.506412
29504.4053531916
E agora vem o number_format para colocar esse produto no padrão brasileiro, ou outro desejado, mas o resultado do cálculo é essa terceira linha.
Oi @Matheus Tavares
>
13 minutos atrás, Matheus Tavares disse:
O único problema é que como são números muito grandes, talvez você precise de uma biblioteca para lidar com a precisão dessa matemática, como fiz naquele exemplo da soma da API, para você, sabe?
Sim é verdade, achei qeu eu tinha que tratar antes, mas como achei o numero muito grande pensei que estivesse no caminho mas faltando algo.
Eu realmente estou pegando uns problemas para resolver, meio incorreto mas seguindo teus conselhos
Ainda vou chegar próximo a este nível kk que vergonha do meu código kkkk
>
16 minutos atrás, Matheus Tavares disse:
echo bcmul( $precototal, $totalemitido, 10 );
Muito obrigada viu, como diz uma tia minha: Persista até aprender kkk>
29 minutos atrás, biakelly disse:
Ainda vou chegar próximo a este nível kk que vergonha do meu código kkkk
Imagina, @biakelly, ninguém nasce sabendo. :P
Lembrando que bcmul é apenas uma multiplicação como qualquer outra, com duas diferenças-chave:
1 - Ele vai permitir definir a escala, ou seja, quantos dígitos eu gostaria de visualizar. Exemplo:
<?php
$precototal = '0.002822102460892938';
$totalemitido = '10,454,760.506412';
$precototal = str_replace( ',', '', $precototal );
$totalemitido = str_replace( ',', '', $totalemitido );
echo $precototal * $totalemitido;
echo "\n";
echo bcmul( $precototal, $totalemitido, 25 );
Saída:
29504.405353192
29504.4053531916039105945184560
2 - Ele vai ser mais preciso do que as operações comuns. https://www.php.net/manual/pt_BR/language.types.float.php
https://www.leaseweb.com/labs/2013/06/the-php-floating-point-precision-is-wrong-by-default/
Principalmente falando de dinheiro, você sempre vai querer utilizar funções com precisão, como as da biblioteca BCMath ou gmp.
Oi, olha eu aqui novamente, persistência é o caminho
Até consegui resolver, creio que isso é uma gambiarra:
var_dump(
number_format(
(
($price = str_replace(array('.', ','), '', $price)) *
($csupply = str_replace(array('.', ','), '', $csupply)) / 1000000000000000000000000),
6,
'.',
','
)