Thread Perl Bug bei int? (44 answers)
Opened by Rolf_PlusW at 2013-03-01 11:29

bianca
 2013-03-01 19:33
#166120 #166120
User since
2009-09-13
6978 Artikel
BenutzerIn

user image
2013-03-01T17:15:29 GUIfreund
int schneidet gnadenlos ab (Rundung Richtung Null).

Nein. Es geht nur entweder oder aber nicht beides.

2013-03-01T17:15:29 GUIfreund
sprintf '%.0f' rundet zur nächsten Integer.

Dann ist es kein int() !

2013-03-01T17:15:29 GUIfreund
@bianca:
Versuch's doch mal mit sprintf '%.0f'. Das dürfte das liefern, was du brauchst.

Das verstehe ich jetzt nicht. Hatten wir nicht damals schon festgestellt, dass dein sprintf() nicht ausreicht? Du warst doch beteiligt damals, oder nicht?
Code (perl): (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
48
49
#!/usr/bin/perl
use strict;
use warnings;

my $space = '.' x 25;
my ($int,$erwartet);
foreach my $test (
    -19854.94 - -3970.99 - -15883.95,'=0',
    .57 * 100,'=57',
    .58,'=0',
    12.345,'=12',
    57.00000000000000001,'=57',
    0.000000000000001,'=0',
    1.01205,'=1',
    -0.903,'=0',
    -1.9999999 + .000000099999999,'=-1'
) {
    if (substr ($test,0,1) eq '=') {
        $erwartet = substr($test,1);
        print "Erwartet '$erwartet'\n\n";
    }
    else {
        $int = GUIfreund($test);
        print "\'$test\'".substr($space,0,25 - length ($test))."geINTet mit GUIfreund: \'$int\'".substr($space,0,25 - length ($int))."\n";
        $int = integer($test);
        print "\'$test\'".substr($space,0,25 - length ($test))."geINTet mit Bianca   : \'$int\'".substr($space,0,25 - length ($int))."\n";
    }
}

###############################################################################

sub GUIfreund {
    sprintf('%.0f',$_[0]);
}
sub integer {
    my $wert = shift ( @_ ) || 0;
    if ($wert =~ /e\-\d+$/) { return 0; }
    if ($wert =~ /\./) {
        my $neu = '';
        for (my $st = 0; $st < length($wert); $st ++) {
            if (substr($wert,$st,1) eq '.') { last; }
            else { $neu .= substr($wert,$st,1); }
        }
        $neu = 0 if $neu eq '';
        $wert = $neu;
        $wert = 0 if $wert == -0;
    }
    return $wert;
}


Quote
'1.81898940354586e-012'....geINTet mit GUIfreund: '0'........................
'1.81898940354586e-012'....geINTet mit Bianca : '0'........................
Erwartet '0'

'57'.......................geINTet mit GUIfreund: '57'.......................
'57'.......................geINTet mit Bianca : '57'.......................
Erwartet '57'

'0.58'.....................geINTet mit GUIfreund: '1'........................
'0.58'.....................geINTet mit Bianca : '0'........................
Erwartet '0'

'12.345'...................geINTet mit GUIfreund: '12'.......................
'12.345'...................geINTet mit Bianca : '12'.......................
Erwartet '12'

'57'.......................geINTet mit GUIfreund: '57'.......................
'57'.......................geINTet mit Bianca : '57'.......................
Erwartet '57'

'1e-015'...................geINTet mit GUIfreund: '0'........................
'1e-015'...................geINTet mit Bianca : '0'........................
Erwartet '0'

'1.01205'..................geINTet mit GUIfreund: '1'........................
'1.01205'..................geINTet mit Bianca : '1'........................
Erwartet '1'

'-0.903'...................geINTet mit GUIfreund: '-1'.......................
'-0.903'...................geINTet mit Bianca : '0'........................
Erwartet '0'

'-1.9999998'...............geINTet mit GUIfreund: '-2'.......................
'-1.9999998'...............geINTet mit Bianca : '-1'.......................
Erwartet '-1'


sprintf() macht hier drei Fehler, soweit ich das sehe.

Aber vielleicht hast du auch eine andere Auffassung davon, was int bedeutet. Für mich bedeutet es das fehlerfreie Abschneiden der Nachkommastellen ohne irgendwelche Rundungen. Denn wenn ich Rundungen haben will habe ich kein int() :)
Aber zum Runden ist sprintf() noch viel mehr ungeeignet als zum int'en.
Last edited: 2013-03-01 19:37:40 +0100 (CET)
10 print "Hallo"
20 goto 10

View full thread Perl Bug bei int?