Avatar billede sorba Nybegynder
31. august 2006 - 14:34 Der er 11 kommentarer og
1 løsning

Perl - optæl præcist

Jeg skal sammentælle et par millioner tal og bruger sprintf for at sikre at alle decimaler er med. Alligevel får jeg en fejl på 0,01 - og lidt til. Min sammentælling SKAL være præcis. Nogen gode ideer???
Avatar billede arne_v Ekspert
31. august 2006 - 15:05 #1
du bruger forhaabentligt ikke floating point ? det skal give "stoej" !

konverter fra streng til heltal (hvis beloeb saa oerer), laeg dem sammen
og put decimal tilbage ved udskrift
Avatar billede sorba Nybegynder
31. august 2006 - 20:00 #2
Tak for hjælpen. Kunne du give mig et eksempel, så jeg kan se syntaksen?
Avatar billede arne_v Ekspert
31. august 2006 - 20:32 #3
det bliver foerst senere saa - jeg er ikke i naerheden af en maskine med Perl
Avatar billede arne_v Ekspert
02. september 2006 - 02:48 #4
min perl er godt nok blevet rusten (men OK det er også 9 år siden jeg
sidst har kigget på det)

eksempel følger

input:

123.45
678.90

normal:

open(F, "num.txt");
$sum = 0;
while($line = <F>) {
    $sum = $sum + $line;
}
close(F);
print "Sum=$sum \n";

heltal:

open(F, "num.txt");
$sum = 0;
while($line = <F>) {
    @parts = split(/\./,$line);
    $sum = $sum + ($parts[0]*100 + $parts[1]);
}
close(F);
$sum1 = ($sum - $sum % 100) / 100;
$sum2 = $sum % 100;
print "Sum=$sum1.$sum2\n";

jeg ved ikke om det hjælper, men det er da værd at prøve
Avatar billede sorba Nybegynder
07. september 2006 - 14:25 #5
Det virker fortrinligt, hvis jeg kun opererer med 2 decimaler - men ikke med 10
Er der nogen smart løsning på det????
Avatar billede arne_v Ekspert
07. september 2006 - 22:13 #6
prøv med en:

use bigint;

øverst i programmet
Avatar billede sorba Nybegynder
13. september 2006 - 13:40 #7
Det duer ikke. Kræver import at en pakke??? Er der andre muligheder???
Avatar billede arne_v Ekspert
13. september 2006 - 17:49 #8
nu havde jeg bignum med i min Perl ...

det er der vel, man må kunne splitte op i 3 dele

men det skal jeg lige tygge lidt på
Avatar billede arne_v Ekspert
18. september 2006 - 03:34 #9
123.4500050001
678.9000050001

og

open(F, "num.txt");
$sum = 0;
$sum3 = 0;
while($line = <F>) {
    @parts = split(/\./,$line);
    $sum = $sum + ($parts[0]*100000 + substr($parts[1],0,5));
    $sum3 = $sum3 + substr($parts[1],5,5);
}
close(F);
$sum = $sum + ($sum3 - $sum3 % 100000) / 100000;
$sum3 = $sum3 % 100000;
$sum1 = ($sum - $sum % 100000) / 100000;
$sum2 = $sum % 100000;
$res = sprintf("%d.%05d%05d",$sum1,$sum2,$sum3);
print "Sum=$res\n";
Avatar billede arne_v Ekspert
18. september 2006 - 04:04 #10
den forrige kode skal iøvrigt også bruge sprintf for at være korrekt
Avatar billede sorba Nybegynder
21. september 2006 - 19:00 #11
Hej arne v. Tusind tak for din indsats.
Sender du et svar,så du kan få dine point?
Avatar billede arne_v Ekspert
21. september 2006 - 20:05 #12
svar
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester