2012-06-25 19 views
5

Tôi hiện đang cố gắng chia counts["email"] một băm chứa số 82.000 theo biến số total có chứa giá trị 1,3 triệu.Tại sao tôi không thể phân chia fixnum bằng một sửa chữa khác?

Khi tôi chạy puts counts["email"]/total tôi nhận được 0.

Tại sao tôi không thể thực hiện phân chia bằng các?

+1

Nếu cả hai toán hạng là số nguyên, Ruby thực hiện phân chia số nguyên: http://mathworld.wolfram.com/IntegerDivision.html –

Trả lời

7

Vì đó là cách Ruby hoạt động: khi bạn chia số nguyên thành số nguyên, bạn nhận được số nguyên. Trong trường hợp này sẽ là 0, bởi vì nó là phần nguyên của kết quả.

Để có được kết quả nổi, chỉ cần nói với Ruby rằng bạn thực sự cần một phao! Có rất nhiều cách để làm điều đó, tôi đoán đơn giản nhất sẽ chỉ là chuyển đổi một trong những toán hạng thành Float ...

puts counts["email"]/total.to_f 
+3

Không chỉ Ruby, đây là hành vi của đa số ngôn ngữ lập trình! Chuyển đổi mẫu số sang phao không phải là cách duy nhất để giải quyết điều này. Nếu tính chính xác của toán học là mong muốn, 'Rational (count [" email "], total)' sẽ cao hơn. Lưu ý rằng 'Rational' nằm trong thư viện chuẩn trong các phiên bản trước 1.9. – Max

+0

Tôi đoán điểm tranh luận là liệu ngôn ngữ được nhập động hay tĩnh. Perl, JavaScript và PHP (các ngôn ngữ tôi đã làm việc nhiều nhất) sẽ in giá trị float ở đây - mặc dù cái thứ hai có kiểu 'Float'. – raina77ow

+1

Ruby và Python 2.7 (không phải Python 3) là các ngôn ngữ được nhập động, trong đó các kết quả phân chia số nguyên trong thương số nguyên chứ không phải là một phao. – Max

0

Bạn cần sử dụng phao để nhận được kết quả "đầy đủ".

counts["email"]/total.to_f 
9

Bạn đang thực hiện phân chia, mặc dù không phải là bạn mong đợi. Có rất nhiều cách khác nhau để phân chia số nguyên trong Ruby:

# Integer division: 
5/4  # => 1 

# Floating point division: 
5.fdiv(4) # => 1.25 

# Rational division: 
5.quo(4) # => Rational(5, 4) 

Bạn cũng có thể chuyển đổi một trong số nguyên của bạn vào một Float hoặc một Rational:

5.to_f/4 # => 1.25 
5.to_r/4 # => Rational(5, 4) 

Lưu ý rằng lần đầu tiên kêu gọi fdiv trực tiếp là faster vì gọi to_f và sau đó sử dụng toán tử /. Nó cũng làm cho nó rõ ràng rằng bạn đang sử dụng phân chia điểm nổi.

+0

Một bình luận cho -1 sẽ được đánh giá cao. –

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