Schrift
Wiki:Tipp zum Debugging: use Data::Dumper; local $Data::Dumper::Useqq = 1; print Dumper \@var;
[thread]9013[/thread]

Fehler beim addieren!: Warum rechnet Perl falsch?

Leser: 1


<< >> 3 Einträge, 1 Seite
Kean
 2007-05-16 14:58
#76734 #76734
User since
2004-08-18
463 Artikel
BenutzerIn

user image
Ich habe eine Subroutine die eine Berechnung durchführt. Im positiven Zahlenbereich klappt das auch ohne Probleme.
Sobald ich aber in den negativen Zahlenbereich gehe kommt es bei manchen Zahlenkonstellationen zu Problemen.

Hier mal der Code:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
sub ausgabesumme
{
print "Vor Artikel: Umsatzsumme:$umsatzsumme, Wert:$wert\n";
if ($storno_kz == 0 && $neuerkunde == 0)
{
if ($pfand_kz == 1)
{ $summepfand++; $umsatzpfand=$umsatzpfand+$pfand_wert; $summe = $summe + $wert + $pfand_wert; }
else
{ $summe = $summe + $wert; }
print "Bearbeitung 1: '$umsatzsumme' + '$wert'\n";
$umsatzsumme = $umsatzsumme + $wert;
print "Umsatzsumme: $umsatzsumme\n";
$Produkt_zaehler[$pid] = $Produkt_zaehler[$pid] + 1;
$anzeigesumme = formatbetrag($summe);
$vorzeichen = '';
}
elsif ($storno_kz == 1 && $neuerkunde == 0)
{
$summestorno++;
if ($pfand_kz == 1)
{ $summepfand--; $umsatzpfand=$umsatzpfand-$pfand_wert; $summe = $summe - $wert - $pfand_wert; }
else
{ $summe = $summe - $wert; }
$umsatzsumme = $umsatzsumme - $wert;
$Produkt_zaehler[$pid] = $Produkt_zaehler[$pid] - 1;
$anzeigesumme = formatbetrag($summe);
$vorzeichen = '-';
}

if ($neuerkunde == 0)
{ $logsatz = &datum.';'.$wahl.';'.$vorzeichen.$wert.';'.$pfand_kz.';'.$vorzeichen.$pfand_wert."\n"; }

if ($neuerkunde == 1)
{
if ($printerstate == 1)
{
open(AUSGABE, ">>$printer");
print AUSGABE eval('"\x1B\x70\x00\x32\x32"');
close(AUSGABE);
}
$logsatz = &datum.';'."-Neuer Kunde-\n";
}
open (AUSGABE, ">>log.txt");
print AUSGABE $logsatz;
close (AUSGABE);
print "Nach Artikel: Umsatzsumme:$umsatzsumme, Wert:$wert\n";
}


Bei dem Printbefehl Bearbeite 1 gibt er z.b. aus:
Bearbeite 1: '-1.4' + '1.6'

als Ergebnis hat die Variable $umsatzsumme danach aber:
0.199999999999999

Wenn ich den Variablen den Wert -1.4 und 1.6 vorher manuell zuweise rechnet er richtig.
Ich habe auch schon versucht vorher nochmal eine Typumwandlung zu erzwingen indem ich $umsatzsumme_int = $umsatzsumme und $wert_int = $wert schreibe und dann addiere. Hierbei kommt allerdings das gleich Ergebnis zu tage.

Die Variable $umsatzsumme wird ganz am Anfang deklariert und mit 0 initialisiert.

Die Variable $wert wird aus einer Ini-Datei gelesen und mit folgendem Code zugewiesen:

Code: (dl )
$wert = readini($produktnr, PREIS, 'produkte.ini');


Hat vielleicht jemand eine Ahnung an was da liegen könnte?
Kean
 2007-05-16 14:59
#76735 #76735
User since
2004-08-18
463 Artikel
BenutzerIn

user image
Durch ausprobieren habe ich bereits herausgefunden das es anscheinend an dem negativen $umsatzsumme Wert liegt. Wenn ich nur diesen manuell auf $umsatzsumme = -1.4; setze rechnet er richtig.

Muss ich vielleicht irgendetwas beachten wenn ich einen negativen Wert zuweise?
pq
 2007-05-16 16:36
#76736 #76736
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
perldoc -q number (perlfaq4)
das ist kein problem von perl oder deinem programm, sondern
von computern im allgemeinen, die zahlen binaer speichern. manche
zahlen lassen sich eben nicht genau binaer darstellen.
am besten, du rechnest möglichst mit ganzen zahlen und teilst erst so
spät wie möglich, oder du machst am ende ein sprintf auf die zahl.
Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live. -- Damian Conway in "Perl Best Practices"
lesen: Wiki:Wie frage ich & perlintro Wiki:brian's Leitfaden für jedes Perl-Problem
<< >> 3 Einträge, 1 Seite



View all threads created 2007-05-16 14:58.