Estou enfrentando um fenômeno muito estranho ao tentar separar números inteiros e decimais de um valor flutuante.
" . numToWords(1004712896.17);
function numToWords($value) : String
{
// $words is used to store the translated string
$words = "";
print "
VALUE: $value";
$whole = floor($value);
print "
WHOLE: $whole";
$deci = $value - $whole;
print "
DECI: $deci";
// continue to translate numbers into words
...
return $words;
}
A saída mostra a Sua visita nos ajuda a continuar oferecendo o melhor para você! decimal com alguns números extras anexados no final:
VALUE: 1004712896.17
WHOLE: 1004712896
DECI: 0.16999995708466001004712896
Percebi que os últimos 12 números são a secção inteira do meu valor. Aliás, não é 0,17 uma vez que eu inseri, mas é 0,1699999…
Posso restaurar 17 se multiplicar por 100 e ceil() o resultado, mas ainda assim, os números extras estão presentes no meu resultado:
$deci = ceil(($value - $whole) * 100);
a saída:
DECI: 17001004712896
Portanto… O que eu fiz de incorrecto? Não creio que a razão seja devassidão de memória, pois tentei fechar a aba e reabri-la, e até fechei meu navegador e reabri-lo, o problema persiste. E o estouro de memória não é o problema, pois zero mudou mesmo depois de reduzir o valor para a tira de milhares.
Há alguma coisa que devo fazer antes de realizar qualquer operação para evitar isso ou é um bug do PHP?
Usando XAMPP versão 8.0.30 no FireFox (mais recente).
Editar:
tentando outro método, usando a string equivalente ao valor, e logo localize a posição do ponto, e separe as Sua visita nos ajuda a continuar oferecendo o melhor para você! partes em 2 strings, ainda assim, os números extras são anexados à substring, mesmo quando eu disse especificamente que só quero 2 caracteres para minha string decimal:
$valstr = strval($value);
print "
VALSTR: $valstr";
$pos = strpos($valstr, ".", 0);
$intstr = substr($valstr, 0, $pos);
$decstr = substr($valstr, $pos+1, 2);
print "
POS: $pos";
print "
IntStr: $intstr";
print "
DecStr: $decstr";
saída: VALSTR: 8712896.34 POS: 7 IntStr: 8712896 DecStr: 34008712896 // deveria ser unicamente 34
Estou começando a pensar que isso é um bug no PHP …
Tags: Sua visita nos ajuda a continuar oferecendo o melhor para você! Nascente Original