|
|
 |

|

 |

| Community » Perl: Allgemeines Forum |
|
Ungenaus Modulo
|
Seitenanfang |
| Hallo, ich möchte gern von Geldbeträgen den Centbetrag berechen. Dazu multiplieziere ich den Betrag mit 100 und berechne davon den Modulo 100. Bei bestimmten Zahlen ist der Rest jedoch immer um 1 niedrieger (zB (73.82 * 100) % 100 = 81 ?!). Dies trifft auch bei anderen Zahlen zu jedoch nicht bei allen. Wenn ich den Modulo gleich ohne Komma berechne funktioniert es. Hier mein Quellcode:
#!/usr/bin/perl -w use strict; my $zahl; print "Zahl eingeben: "; $zahl = <STDIN>; chomp($zahl); print "Zahl: ",$zahl, "\n"; my $rest = ($zahl * 100); print "Zahl mal 100: ",$rest, "\n"; $rest = ($rest % 100); print "Rest: ",$rest,"\n";
Danke schon mal im Vorraus. Felix
Datum: 29.09.2007-12:55

|
re: Ungenaus Modulo
|
Seitenanfang |
| Huch. Das ist aber unangenehm... Wuerdest du dazu noch etwas posten, wenn du etwas herausfindest? Ansonsten wuerde ich schon fast einen Bug unterstellen.... Gruss, mooze.
Datum: 02.10.2007-14:11

|
re: Ungenaues Modulo
|
Seitenanfang |
| Hallo mooze, danke das du dich gemeldet hast, dachte schon ich hätte was volkommen dummes gepostet^^ also es ist wirklich seltsam wegen diesem modulo problem... ich habe immer noch keine weitern dinge dazu herausgefunden... muss zugeben so lange programmiere ich mit perl noch nicht ich dachte jedoch solch ein simples i/o-script wäre für perl genau das richtige hmm... das es dann so kommt kann ja keiner ahnen... das interessante daran ist ja wirklich das, dass es bei z.b. 73.82 nicht funktioniert ( ergebniss = 81) sowie bei zB 2.03 (rest = 2) oder 70.35 (rest = 34) usw jedoch bei 73.81 funktionier es ( ergebniss = 81) sowie bei diversen anderen zahlen ...das ist das was mich so verblüfft... einfach mal probieren ^^ naja vielleicht fällt ja noch jemand anderen was dazu ein wäre echt praktisch danke nochmal felix
Datum: 02.10.2007-15:12

|
re: Ungenaues Modulo
|
Seitenanfang |
| Hallo Felix, ich habe mir erklaeren lassen, dass dies durch die Vermischung von Gleitkommaoperationen (12.34 * ...) und Ganzzahloperationen (modulo) passieren kann. In der Gleitkomma-Repraesentation ist deine Zahl nunmal technisch bedingt nicht *ganz* genau, sondern nur eine Annaeherung. Das ist in den meisten Programmiersprachen aehnlich. Bei der Umwandlung in eine Ganzzahl passiert also etwas "unerwartetes". Mein persoenlicher Tipp waere, das ueber String-basierte Verarbeitung zu loesen: if (my ($euro, $cent) = $preis =~ m/^(\d+)[,.](\d{2})/g) { ... } Gruss, mooze
Datum: 02.10.2007-16:53

|
re: Ungenaues Modulo
|
Seitenanfang |
Hi moozedanke für das Erkundigen... is nur schade ich wollte es eigentlich über diese rechnung machen und nicht über eine string-operation... gibt es keine möglichkeit perl zu sagen das er genauer arbeiten soll? im prinzip versteh ich auch nicht, dass er schon bei zwei stellen nach dem kommer ungenau werden kannund vor allen ändert sich ja die dezimalstelle nicht... vielleicht weis dazu ja noch jemand was ... aber vielen dank für die bemühungen mooze ich werd es dann halt erstmal über dein weg machen danke nochmal felix
Datum: 02.10.2007-18:04

|
re: Ungenaues Modulo
|
Seitenanfang |
use Math::BigFloat;my $x = Math::BigFloat->new('73.82'); $x *= 100; print $x % 100, "\n";
oder
use Math::BigFloat;my $x = Math::BigFloat->new('73.82'); # oder auch # my $x = Math::BigFloat->new; # $x = '73.82'; $x->bmul(100); print $x->bmod(100), "\n";
Lesestoff: http://de.wikipedia.org/wiki/Gleitkommazahl#Gleitkommazahlen_in_der_Digitaltechnik
Datum: 02.10.2007-21:26

|
re: Ungenaues Modulo
|
Seitenanfang |
| vielen dank für die hilfe... hilft mir sehr weiter... auch nochmal danke an mooze für die unterstützung grüsse felix
Datum: 03.10.2007-18:42

|
|

|

|

|
 |

|

|
|