Mailinglisten-Archive |
Andreas Braukmann schrieb am Sonntag, den 15. August 1999: > > Nein, das ist ein kaufmaennischer Rundungsfehler: > und die soll eben Verfaelschung von gerundeten Datenmengen > verhindern. Die Theorie mit dem absichtlichen "statistischen" Runden würde mir ja auch als Erklärung gefallen, aber wenn ich mir direkt im Sourcecode ansehe, wie die Funktion round() programmiert ist, muß ich klar sagen: Jein! :-) PHP-Source functions/math.c: | /* {{{ proto int round(double number) | Returns the rounded value of the number */ | void php3_round(INTERNAL_FUNCTION_PARAMETERS) | { | pval *value; | TLS_VARS; | | if (ARG_COUNT(ht) != 1 || getParameters(ht, 1, &value) == FAILURE) { | WRONG_PARAM_COUNT; | } | if (value->type == IS_STRING) { | convert_string_to_number(value); | } | if (value->type == IS_DOUBLE) { | RETURN_DOUBLE(rint(value->value.dval)); ^^^^ An dieser Stelle wird bei Fließkommazahlen mit Hilfe der C-Funktion "rint" gerundet. | } | if (value->type == IS_LONG) { | RETURN_DOUBLE((double)value->value.lval); | } | RETURN_FALSE; | } | /* }}} */ Und falls "rint" an einem System nicht vorhanden ist, wird es zuvor optional selbst definiert: | #ifndef HAVE_RINT | /* emulate rint */ | inline double rint(double n) | { | double i, f; | f = modf(n, &i); | if (f > .5) | i++; | else if (f < -.5) | i--; | return i; | } | #endif Das ist nicht die vermutete wissenschaftliche Rundung, sondern das ganz normale Aufrunden ab 0.5 - mit einer Seltsamheit allerdings: Ich hätte ">= .5" und "<= -.5" geschrieben. Ob das ein Fehler oder Absicht des Autors ist, weiß ich nicht. Falls aber die Funktion "rint" eh vorhanden ist (hmm, wo ist das nicht der Fall?), dann wird gemäß IEEE-754 gerundet, und das geht bei genau 0.5 tatsächlich immer in Richtung der geraden Zahl. Ciao, Martin -- Martin Ramsch <m.ramsch_(at)_computer.org> <URL: http://ramsch.home.pages.de/ > PGP: 0xE8EF4F75, 52 44 5E F3 B0 B1 38 26 E4 EC 80 58 7B 31 3A D7
php::bar PHP Wiki - Listenarchive