Fehler in Berechnung - Negative Zahl wird ab und zu ausgegeben

Sasser

Erfahrenes Mitglied
Guten Tag!

Ich habe eine kleine, aber simple Berechnung in einem Script. Das koriose: Ab und zu kommt eine negative Zahl heraus, obwohl das nicht möglich ist. Beim folgenden Beispiel ebenfalls:

PHP:
round ( rand ( 0, ( 74505449345 / 100 ) * 15 ) );

Warum kommt dabei -446976817 heraus?
 
Das ist ein Überlauf weil du über dem maximalen Wertebereich vom Integer hinaus bist, denke ich:
http://de2.php.net/manual/de/language.types.integer.php

Eventuell hilft dir diese Funktion, da sie BC Math als Grundlage hat und somit einen größeren Wertebereich unterstützt:
http://de2.php.net/manual/de/ref.bc.php#84734

Selbstverständlich musst du deine Berechnungen (Hunderstel "mal" 15) alle mit bcdiv und bcmul bewerkstelligen.

Darf man erfahren warum die Zufallszahl so groß seien soll?
 
Zuletzt bearbeitet:
Ich würde sogar sagen, dass es schon bei der rand Funktion im zweiten Argument passiert, da round für beide Argumente integer haben will (lass dir PHP_INT_MAX ausgeben). Deine Werte gehen darüber hinaus und werden auf Integer "gecastet".
So wird aus deiner 11175817401.8 (=74505449345 / 100 * 15) eine -1709084487 und rand arbeitet dann mit 0, -1709084487.
Das ist wie gesagt ein Überlauf (arithmetischer Überlauf).
 
Zuletzt bearbeitet:
Kannst du mir an meinem Code das mal demonstrieren, wie ich das löse!?

Ich muss das richtig verstehen, damit ich das auf andere Sachen noch anwenden kann!

Wäre echt nett von dir ;)
 
Hat diese Lösung auch kein Erfolg gebracht?
http://de2.php.net/manual/de/ref.bc.php#84734

Also es gibt einige mathematische Erweiterungen bei PHP, die das rechnen mit größeren Zahlen möglich macht bzw. genauer Rechnen lässt, da PHP auch mit besonders langen Nachkommastellen Probleme hat:
http://de.php.net/manual/de/refs.math.php

Ich habe dir BC Math "vorgestellt", da dies mir als erstes für dein Problem einfiel.
http://de.php.net/manual/de/intro.bc.php

Weil ich von dort auch das generieren von großen Zufallszahlen kenne:
http://de.php.net/manual/de/ref.bc.php#84734

Implementiert man die dortige Funktion lässt sie sich so nutzen:
PHP:
// Zufall bis 1 000 000 000 000
bcrand("1000000000000");
// Zufall zwischen zwei Zahlen
bcrand("1000000000000", "2340000000000");
// Mit übergebener Variable per Type-Cast
$i = 1.23457e+010;
bcrand ( (string) $i);

BC Math verwendet und möchte Zahlen in Strings.
 
Ich danke für die Hilfe!

Aber mir ist unklar, warum PHP keine großen Zahlen rundet!? Wer hat sich denn so einen Quatsch einfallen lassen, dass man nur bis zu einer bestimmten Größe eine Zufallszahl gegenrieren kann und danach einfach ein Minus davor setzt!

KANN MAN DIESE GRENZE NICHT HERAUFSETZEN?
 
Zuletzt bearbeitet:
Ja aber es kann doch nicht sein, dass ein Script nicht mehr funktioniert, sobald man über einen bestimmten Wert kommt!?

Bestimmte Funktionen in PHP werden doch dadurch sinnlos, wenn man eigene Funktionen zum Runden bauen muss, weil die Standartfunktionen dann nicht mehr funktionieren!?

Kann man dass nicht vernünftig lösen...
 
Doch, die Lösung hat Zodiac dir oben bereits gegeben... die Zahlen als String definieren und dann mit den Funktionen von BCMath rechnen.
 
Zurück