Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Muito boa noite Senhores,
Já acompanho o fórum a muito, muito tempo, mas nunca tive a necessidade de postar pois graças aos nobres colegas que são feras sempre sanei minhas dúvidas em post já resolvidos.
Acontece que tenho um caso no mínimo inusitado para mim:
Estou com um projeto de um cliente que trabalha com venda de concreto, desses de betoneira e vende o material em M³ (cubicos), porém o cliente dele, tras a medida em M² (quadrados), para fazer a conversão ele calcula essa area (M²) multiplicando pela altura por emplo de laje em 0,08, logo, Seria M² X 0,08 = M³... porém, o caminhão só sai com medidas pre determinadas, Tipo 1,5m³, 3M³, 4M³, 5,5M³....
Acontece que em alguns calculos dá medidas quebradas ex:
20M² - 20X0,08=1,6M³
26M² - 26X0,08=2,08M³
Assim sendo esses valores deveriam ir para o próximo meio possível, ou seja arredondaria para a proxima metade acima....
1,6 passaria para 2M³ e 2,08 para 2,5M³
Tentei de todas as formas e não consegui chegar nesse resultado, visto que com CEIL 1,6 passaria para 2, porém 2,08 passaria para 3.....
Com ROUND 1,6 passaria para 2, porem 2,08 iria para 2 e o cliente tomaria prejuizo....
Sendo assim gostaria da ajuda dos nobres colegas para me ajudar a resolver esse porém...
Abaixo o código que escrevi, mas não chegou ao valor necessário...
$total = 0;
foreach ($produtos as $p) {
$m3=$p->quantidade * $p->altura;
$preco=$p->precoVenda;
$m3=round($m3,1,PHP_ROUND_HALF_UP);
if ($p->unidade == "M³"){
$subTotal = $preco * $m3;
}
else { $subTotal = $p->quantidade * $preco;
}
$total = $total + $subTotal;
$m3total = $m3total + $m3;
Meu problema está exatamente aqui:
$m3=round($m3,1,PHP_ROUND_HALF_UP);
Desde Já grato pela atenção de todos.
Poxa, não tinha pensado no explode, pode crer...
Vou tentar fazer aqui e posto o resultado...
Quanto ao prejú, o cliente dele vai receber o valor correto, mas por exemplo 2.08 ou 2.4 se arredondar pra baixo o cara receberá só 2M³ de concreto, nesse caso se ele precisa de 2.4M³ é melhor sobrar 0.10 que falta 0.4...
Mas agradeço imensamente a luz, eu realmente não tinha nem cogitado o explode....
;)
>
Testei aqui e o resultado é o mesmo esperado.
<?php
$valor = 26 * 0.08;
//Coloquei 2 no segundo paramentro
echo round($valor,2,PHP_ROUND_HALF_UP);
No Ideone
Agora se você quer arrendondar 2.08 para 2.5 e 2.6 ir para 3, crie uma regra, use explode para separar os decimais, se for maior que 0.10 vai para 0.50 e for maior que 0.60 vai para 1.0, ai é só somar novamente os valores.
Assim quem toma o Preju já sabemos quem é! :P
Valeu mesmo amigo, cheguei nesse ponto, vou testar no sistema ver se fica ok, mas aparentente está ótimo
<?php
$valor = 74.875* 0.08;
//Coloquei 2 no segundo paramentro
echo "round: ";
echo round($valor,2,PHP_ROUND_HALF_UP);
$m3 = explode(".",$valor);
if ($m3[1]>0 && $m3[1] < 50) {
$m3[1] = 50;
$resultado = $m3[0].".".$m3[1];
echo "resultado: ";
echo $resultado;
} if ($m3[1]>50 && $m3[1] <= 99) {
$resultado = $m3[0]+1;
echo "resultado: ";
echo $resultado;
}
}
Se ficar certinho volto aqui pra fechar o tópico
No PHP7
voce pode fazer assim
function calcular(float $metros, float $altura = 0.08) : float
{
$resultado = $metros * $altura;
return $resultado;
}
$valor = '74.875';
var_dump( calcular($valor) );
Você teria certeza que a entrada e saida seria do Type Float
Testei aqui e o resultado é o mesmo esperado.
//Coloquei 2 no segundo paramentro
echo round($valor,2,PHP_ROUND_HALF_UP);
No Ideone
https://ideone.com/wvXA4Y
Agora se você quer arrendondar 2.08 para 2.5 e 2.6 ir para 3, crie uma regra, use explode para separar os decimais, se for maior que 0.10 vai para 0.50 e for maior que 0.60 vai para 1.0, ai é só somar novamente os valores.
Assim quem toma o Preju já sabemos quem é! :P