perlunity.de - PERL | JAVASCRIPT | PHP | MySQL | APACHE



#!/COMMUNITY

Members: 5374
davon online: 1
weitere User: 27
Click for quality!




10.02.2012 / 08:40

Community-Member werden   |   Paßwort vergessen   |   OnlineMonitor (1) Wer ist online ... OnlineMonitor starten !
     

 

Home


PERLscripts


PHPscripts


JAVAscripts


Hilfreiches


Links2www


Newscenter


Community


Interna




Community  »  Perl: Allgemeines Forum zur Themenübersicht Themensuche Themenansicht in Thread-Modus


BeitragUngenaus 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

Beitragre: 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

Beitragre: 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

Beitragre: 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

Beitragre: Ungenaues Modulo
Seitenanfang

Hi mooze

danke 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

Beitragre: 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

Beitragre: 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

-






-
-