Visualizzazione risultati 1 fino 7 di 7

Discussione: Bug PHP funzione sprintf

  1. #1
    Guest

    Thumbs down Bug PHP funzione sprintf

    Non sapevo se segnalare la cosa, in quanto immagino che essendo la versione di PHP 5.3 uscita da molto tempo e ancora non aggiornata sui sistemi Altervista, credo che non sarà grazie a questo post che si potrà immaginare un aggiornamento, ad ogni modo, visto che ho ricevuto una mail di altervista che mi esorta ad esprimere il mio giudizio sul servizio offerto... ne approfitto per dire che ho riscontrato questo problema, che purtroppo rende inutilizzabile l'uso dell'hosting presso di voi.

    Esiste un bug di PHP che è stato risolto nella versione 5.3 e che riguarda la funzione sprintf. La trasformazione di valori float in valori stringa può causare degli errori piuttosto gravi, principalmente alcuni valori vengono trasformati in una stringa di valore numerico non esatto e riportante un : (sibolo dei due punti) all'interno del valore numerico!

    Questo purtroppo pare succedere solo nel caso in cui la funzione sprintf sia chiamata all'interno di procedure complesse che mettano il server in condizione di "sporcare" la propria memoria e spesso non accade se la funzione viene chiamata semplicemente in un sito "vuoto".

    Ad ogni modo se vorrete provare questa funzione (echo sprintf('%.16F',"2078");) sul mio sito ritorna il valore:

    2077:.0000000000000000

    invece di

    2078.0000000000000000

    Naturalmente questo tipo di bug rende inutilizzabile il servizio offerto se si ha bisogno di utilizzare la suddetta funzione.

    Fatemi sapere se qualcuno di voi ha avuto modo di testare la funzione, naturalmente lo stesso identico sito e la stessa funzione ritorna il valore corretto su un server locale che monta PHP 5.3.

    Grazie!

  2. #2
    L'avatar di binarysun
    binarysun non è connesso Utente storico
    Data registrazione
    02-07-2004
    Messaggi
    2,017

    Predefinito

    Se i tuoi problemi bloccanti sono questo tipo di bug abbandona PHP.
    Ovviamente AV non può aggiornare la verisone di PHP ogni volta che viene corretto un bug ....ci saranno più di 1500 bug ancora aperti e questo non è certo il più grave.
    "L'intelligenza è una pianta che va curata continuamente.
    Dovreste vedere com'è bello, il mio bonsai."
    Rat-man®

    [Gradient Text]
    [Su che server sei?]
    ->flickr

  3. #3
    Guest

    Predefinito

    Sono d'accordo con te che non si possa aggiornare PHP ad ogni correzione di bug ma la versione 5.3 è stata rilasciata a giugno del 2009, anche chi pensa di offrire servizi informatici aggiornando i propri software ogni 2 anni dovrebbe pensare di abbandonare il mondo dei provider.

    Ad ogni modo a me la funzione sprintf serve per creare una stringa di valori da passare ad una funzione java, più precisamente al componente highcharts. Visto che mi sembri molto preparato, quali alternative avrei per raggirare l'ostacolo sprintf?

    Grazie.

  4. #4
    L'avatar di binarysun
    binarysun non è connesso Utente storico
    Data registrazione
    02-07-2004
    Messaggi
    2,017

    Predefinito

    Dipende se devi fare una certa formattazione al numero.

    Cmq Sembra che la conversione in stringa del floating point sia un grosso problema per PHP
    http://www.mysqlperformanceblog.com/...ersion-caveat/

    L'alternativa a sprintf come nell'esempio è
    $varStringa = "$varFloat"; //tra virgolette
    Oppure (ma non so se funziona correttamente)
    $varStringa = (string)$varFloat; //Forzi il casting e la conversione che DOVREBBE essere implicita.
    Oppure ancora se ti serve la formattazione provare con "number_format".
    "L'intelligenza è una pianta che va curata continuamente.
    Dovreste vedere com'è bello, il mio bonsai."
    Rat-man®

    [Gradient Text]
    [Su che server sei?]
    ->flickr

  5. #5
    L'avatar di caribe1999
    caribe1999 non è connesso Neofita
    Data registrazione
    20-02-2010
    Messaggi
    1

    Predefinito

    Bug o non bug in 2078.0000000000000000 ci sono 20 cifre significative quando con un floating point a 64 bit hai una mantissa da 16 cifre decimali, quindi in ogni caso quel numero non sarebbe rappresentabile nella sua interezza.

  6. #6
    Guest

    Predefinito

    Grazie binarysun per i suggerimenti, ora proverò sicuramente a vedere se alcuni di questi metodi che mi hai descritto possono risolvere il mio problema.

    Cercando in giro ho trovato chi si è imbattuto nel mio stesso problema di PHP

    http://bugs.php.net/bug.php?id=47716

    Ad ogni modo nel mio progetto sto utilizzando un framework php che utilizza una modulo per generare stringhe JSON. Questo modulo al suo interno fa una trasformazione di un array di valori da poter passare in forma di testo alla funzione javascript con tra le varie la funzione incriminata. Mi bastavano 4 cifre dopo la virgola.

    Ad ogni modo grazie a tutti per il supporto.

  7. #7
    Guest

    Predefinito

    Ciao binarysun, ci tenevo ad informarti che ho provato a seguire le strade che mi hai indicato e rivedendo un po' le varie procedure sono riuscito a raggirare l'ostacolo usando la trasformazione da float a string tramite:

    $varStringa = "$varFloat"; //tra virgolette

    Grazie per la dritta! ;)

Regole di scrittura

  • Non puoi creare nuove discussioni
  • Non puoi rispondere ai messaggi
  • Non puoi inserire allegati.
  • Non puoi modificare i tuoi messaggi
  •