2009-10-30 31 views
5

Tôi đã tìm kiếm quy ước làm tròn được sử dụng bởi chức năng dựng sẵn của Perl sprintf.Tại sao chạy nước rút của Perl không làm tròn số dấu chấm động chính xác?

Tôi đã suy nghĩ rằng nó hoạt động làm tròn bình thường (ví dụ ROUND_HALF_UP như trong Java's rounding mode convention), nhưng đào thêm chứng minh điều này là sai:

> /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

in (sprintf (...))? Tôi tự hỏi nếu có một "printf" ... – jrockway

+1

Hãy xem [Perl Cookbook recipe 2.2 - làm tròn số dấu chấm động] (http://books.google.com.vn/books?id=hP4IRp8xwTkC&pg=PA64&lpg=PA64&dq= làm tròn số + số + perl + sách nấu ăn & nguồn = bl & ots = ti7Tyxr3s7 & sig = gyWX-iySyiVZef0vB43ZuIaxkuw & hl = vi & ei = RPzrStmzO4z0MarIvKkI & sa = X & oi = book_result & ct = kết quả & resnum = 1 & ved = 0CAwQ6AEwAA # v = onepage & q = & f = false) để có giải thích đầy đủ hơn – heferav

Trả lời

16

Bạn đã được cắn bởi thực tế là số dấu chấm động không biểu diễn chính xác các phân số thập phân. Đây là những gì tôi nhận được:

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> 

Kể từ 0,335 được thể hiện trong nội bộ như hơi lớn hơn 0,335 nó vòng tới 0,34, trong khi 1,335 là hơi ít hơn 1,335, vì vậy nó vòng đến 1,33.

Các vấn đề liên quan