Warum php denkt, dass große Ints Floats sind (aber nur manchmal)?

8

Entschuldigung für den schlechten Titel, aber ich weiß nicht, wie ich das nennen soll.

%Vor%

Ausgabe:

  

Warnung: rand () erwartet, dass Parameter 2 eine Ganzzahl ist, float gegeben ist   in /srv/webroot-sandbox/index.php(73): eval () 'd Code in Zeile 1

     

Warnung: rand () erwartet, dass Parameter 2 eine Ganzzahl ist, float gegeben ist   in /srv/webroot-sandbox/index.php(73): eval () 'd Code in Zeile 2

     

Warnung: rand () erwartet, dass Parameter 2 eine Ganzzahl ist, float gegeben ist   in /srv/webroot-sandbox/index.php(73): eval () 'd Code in Zeile 3

%Vor%

Kann jemand erklären, was vor sich geht? Das ist PHP 7, es funktionierte in PHP 5 gut (zumindest habe ich keine Warnungen erhalten).

    
MightyPork 02.03.2016, 19:11
quelle

2 Antworten

11

PHP-Ints sind signierte 64-Bit-Werte (außer Sie befinden sich in einer 32-Bit-Installation), also gehen sie (grob)

%Vor%

In wissenschaftlicher Schreibweise, -9.2e18 - & gt; + 9.2e18

Ihre "schlechten" Werte sind einfach ganze Zahlen, die zu groß sind, um sie als Ganzzahlen zu speichern, und PHP konvertiert in Gleitkommazahlen, um möglichst viele Werte zu erhalten.

Und da Sie 10e18 haben, ist das tatsächlich 1e19 und außerhalb des max_int-Bereichs.

    
Marc B 02.03.2016, 19:31
quelle
6

Ihre Frage kann plattformabhängig sein wie der Ganzzahlbereich von a:

  • 32-Bit-Plattform ist -2,147,483,648 bis 2,147,483,647
  • 64-Bit-Plattform ist -9,223,372,036,854,775,808 bis 9,223,372,036,854,775,808

Für mich läuft ein 64-Bit-System das folgende Ergebnis.

%Vor%

Diese Ausgabe korreliert direkt mit Ihren Ergebnissen und erklärt möglicherweise eine Geige oder Ihren Webhost, um unterschiedliche Ergebnisse zu zeigen.

Der Grund, warum es sich in PHP 7 anders verhält, ist hier erklärt:

  

Bisher wurden interne Funktionen stillschweigend Zahlen abgeschnitten   erzeugt von Float-zu-Integer-Koerzidenzen, wenn der Float zu groß war   als ganze Zahl darstellen. Jetzt wird ein E_WARNING ausgegeben und NULL   wird zurückgegeben.

    
Xorifelse 02.03.2016 19:30
quelle

Tags und Links