J'ai une liste de chaîne (taille en octets), je lis ceux du fichier. Disons que l'une des chaînes est 2968789218, mais lorsque je la convertis en float, elle devient 2,00.
C'est mon code jusqu'à présent:
$string = "2968789218";
$float = (float)$string;
//$float = floatval($string);
//the result is same
// result 2.00
N'importe qui?
Le problème était en fait l'encodage. C'est bien maintenant quand je change l'encodage du fichier: D
Étonnamment, il n'y a pas de réponse acceptée. Le problème n'existe qu'en PHP 32 bits.
De la documentation ,
Si la chaîne ne contient aucun des caractères '.', 'E' ou 'E' et que la valeur numérique respecte les limites de type entier (telles que définies par PHP_INT_MAX), la chaîne sera évaluée comme un entier. Dans tous les autres cas, il sera évalué comme un float.
En d'autres termes, le $string
est d'abord interprété comme INT, ce qui provoque un débordement (La valeur $string
2968789218 dépasse la valeur maximale (PHP_INT_MAX
) de PHP 32 bits, soit 2147483647.), Puis évaluée à float by (float)
ou floatval()
.
La solution est donc:
$string = "2968789218";
echo 'Original: ' . floatval($string) . PHP_EOL;
$string.= ".0";
$float = floatval($string);
echo 'Corrected: ' . $float . PHP_EOL;
qui produit:
Original: 2.00
Corrected: 2968789218
Pour vérifier si votre PHP est 32 bits ou 64 bits, vous pouvez:
echo PHP_INT_MAX;
Si votre PHP est en 64 bits, il imprimera 9223372036854775807
, sinon il imprimera 2147483647
.
$ float = floatval ($ string);
Essayez d'utiliser
$string = "2968789218";
$float = (double)$string;
Si la fonction floatval ne fonctionne pas, vous pouvez essayer ceci:
$string = "2968789218";
$float = $string * 1.0;
echo $float;
Mais pour moi, toute la réponse précédente a fonctionné (essayez-le dans http://writecodeonline.com/php/ ) Peut-être que le problème est sur votre serveur?