3

Lo que sucede, es que estoy tratando de convertir un número (float) a un (string). El problema, es que al momento de pasar un float con más de 10 dígitos en la parte entera, me quita un decimal de los 4 decimales que quiero mostar, es decir, si la parte entera es menor a 10 dígitos, no hay ningún inconveniente, pero cuando no, llega el problema, de esta manera:

function number_string(string $number){          
    $number = $number.'';
    return $number;
}    

$number = 1234567890.9245;    
var_dump(number_string($number))

RESPUESTA: string(15) "1234567890.9245"--->(Está correcto)

$number = 1234567890**12**.9245; 

RESPUESTA: string(15) "123456789012.92"--->Me quitó dos decimales

Luis Fernando
  • 760
  • 3
  • 13
  • Intenta hacer `var_dump( $number )`, **antes** de llamar a tu función, a ver que pasa :-) – Trauma Feb 04 '19 at 18:43
  • 1
    Relacionado: [¿ Por qué mis programas no pueden hacer cálculos aritméticos correctamente ?](https://es.stackoverflow.com/q/197/19610) – Trauma Feb 04 '19 at 18:44
  • Ok, lo hice. Pero sigue con el mismo problema. Es que creo que el tipo de dato 'float' restringe o limita la cantidad de números enteros, porque antes de convertir el número a (string), ya el número llega aproximado. – Luis Fernando Feb 04 '19 at 18:48
  • 1
    ¡ Correcto ! En la propia documentación te dan alternativas, pero **fuera** del lenguaje base: http://php.net/manual/es/language.types.float.php En otras palabras: con PHP *puro* no podrás. – Trauma Feb 04 '19 at 18:50
  • Gracias amigo, ya estoy buscando otras alternativas de conversión, creo que trataré de asegurarme que el número siempre llegue como string, para no tener lío con las cifras numérica. Muy amable (Y) – Luis Fernando Feb 04 '19 at 19:21
  • Si lo haces como `string`, los resultados serán **exactos** siempre ... siempre y cuando que allí donde crees ese `string` no tengas el mismo problema. Te va a resultar difícil, te aviso :-) – Trauma Feb 04 '19 at 19:23
  • php suele hacer el cast automatico ya que no requiere tipificacion asi que un int puede ser usado como string pero si deseas tambien puedes hacer `$number = (string ) 1234567890.9245;` – Bryro Feb 04 '19 at 21:01
  • 1
    Probé de varias maneras y no fue posible logar un modo que impida que PHP haga una conversión del valor. La esperanza más viable que veo es con `json_decode`, si tuviera una bandera del tipo `JSON_FLOAT_AS_STRING`, que convierta el valor como una cadena sin tocarlo... [Esto fue sugerido en PHP](https://wiki.php.net/rfc/json_numeric_as_string), pero los votos indican que fue rechazado, no sé por qué motivo. – A. Cedano Feb 04 '19 at 21:50
  • @Bryro, Si, ya lo hice así, pero el problema es que cuando la parte entera supera los 10 dígitos, me empieza a quitar un decimal por cada dígito demás que introduzca en la parte entera. Pero en todo caso te agradezco. – Luis Fernando Feb 04 '19 at 22:10
  • @A.Cedano , Gracias hombre. Vale, voy a intentar como tu dices, a mi también se me ocurre que ese puede ser el camino. Sin embargo, ya me aseguré que el número(parametro) que llega al método, siempre llegue tipo 'string'. Y una vez garantizado eso, tenía otro inconveniente con el métoodo de PHP (number_format), me tocó hacer un number_format a mano para evitar la aproximación que este mismo también me generaba. De antemano muchas gracias A.Cedano , muy amable. – Luis Fernando Feb 04 '19 at 22:14

1 Answers1

3

Puedes hacerlo de esta manera:

$string = sprintf("%.4f", $number); 

Con ello conseguimos mantener los 4 decimales aunque la parte entera sea mayor a 10 dígitos.

Código completo:

$number= 123456789012.9245;
$string = sprintf("%.4f", $number); 
echo $string;

Al utilizar la función number_string() he tenido que utilizar la funcion floatval() de PHP para lograrlo, ya que si no el resultado era: 123456789012.9200. En vez de quitarte los decimales como te sucede a ti, los convierte en 0 (Curioso).

Pero utilizando la función floatval(), logré conseguirlo:

function number_string($number){          
    return $string = sprintf("%.4f", floatval($number));
}    

$number = 123456789012.9245;    
var_dump(number_string($number));

Espero que sea de utilidad!

DevMind
  • 5,025
  • 11
  • 29
  • 60
  • Muchas gracias @Mario Guiber, probé tu ejemplo y sí, efectivamente me muestra el número correctamente aún pasando de 10 digitos en la parte entera. Peeeroo... Al momento de pasar más de 12 dígitos en la parte entera, la parte decimal empieza a variar, generando un nuevo inconveniente, ya que no necesito que los decimales varíen. Lo que no mencioné "Y me disculpo", es que es probable que me llegue un número con (Máximo 16 enteros). – Luis Fernando Apr 29 '19 at 13:39