2009-10-30 2 views
5

J'étais à la recherche de la convention d'arrondi utilisée par la fonction intégrée de Perl sprintf.Pourquoi le sprint de Perl ne tourne-t-il pas correctement les nombres à virgule flottante?

Je pensais qu'il fait un arrondi normal (par exemple ROUND_HALF_UP comme dans Java's rounding mode convention), mais creuser encore prouvé ce à tort: ​​

> /usr/local/bin/perl5.10.1 -e 'print(sprintf("%.2f", shift @ARGV)."\n");' 0.335 
0.34 
> /usr/local/bin/perl5.10.1 -e 'print(sprintf("%.2f", shift @ARGV)."\n");' 1.335 
1.33 
+7

impression (sprintf (...))? Je me demande s'il y a un "printf" ... – jrockway

+1

Jetez un coup d'œil à [Recette Perl Cookbook 2.2 - arrondir les nombres à virgule flottante] (http://books.google.com/books?id=hP4IRp8xwTkC&pg=PA64&lpg=PA64&dq= arrondi + nombre + perl + livre de cuisine & source = bl & OTS = ti7Tyxr3s7 & sig = gyWX-iySyiVZef0vB43ZuIaxkuw & hl = fr & ei = RPzrStmzO4z0MarIvKkI & sa = X & oi = book_result & ct = résultat & resnum = 1 & ved = 0CAwQ6AEwAA # v = OnePage & q = & f = false) pour une explication plus complète – heferav

Répondre

16

Vous avez été mordu par le fait que les nombres à virgule flottante ne sont pas représentations exactes des fractions décimales. Voici ce que je reçois:

DB<1> $a=0.335 

    DB<5> print sprintf("%.19f",$a) 
0.3350000000000000200 
    DB<7> $b=1.335 

    DB<8> print sprintf("%.19f",$b) 
1.3349999999999999645 
    DB<9> 

Depuis 0,335 est représenté en interne légèrement plus grand que 0,335 arrondit à .34, tandis que 1,335 est légèrement inférieur à 1,335, il arrondit à 1,33.

Questions connexes