2009-09-19 21 views
12

Tôi chỉ đơn giản là cố gắng để có được một tỷ lệ phần trăm.Ruby từ chối chia chính xác

irb(main):001:0> (25/50) * 100 
=> 0 

Điều này chắc chắn nhất bằng 50, theo xác nhận của máy tính của tôi (được sao chép và dán cùng phương trình vào gcalc). Tại sao Ruby từ chối làm điều này?

+11

bằng cách này , nếu phân chia thực sự bị phá vỡ trong Ruby, bạn có thực sự nghĩ rằng bạn sẽ là người đầu tiên nhận thấy nó? Nó luôn luôn làm tôi ngạc nhiên như thế nào mọi người nhìn thấy một hành vi bất ngờ và luôn luôn giả định nó là lỗi của ngôn ngữ, thư viện, môi trường, vv, và không bao giờ là lỗi của mã riêng của họ ... –

+0

@ Daniel: Không chỉ Ruby, bất kỳ ngôn ngữ ... – gbn

+0

Hầu hết các ngôn ngữ hoạt động như thế này, javascript là một ngoại lệ đáng chú ý. Trên thực tế Ruby là cực kỳ mát mẻ, tự động chuyển từ Fixnum sang Bignum khi bạn cần độ chính xác cao hơn. (BTW, những người khác làm điều đó? Phải có một số lang mà hiện nó ...) – DigitalRoss

Trả lời

28

Đang thực hiện phân chia số nguyên.

Về cơ bản, 25 là một số nguyên (một số nguyên) và như vậy là 50, vì vậy khi bạn chia cái kia, nó sẽ cho bạn một số nguyên khác.

25/50 * 100 = 0.5 * 100 = 0 * 100 = 0 

Cách tốt hơn để làm điều đó là nhân trước, sau đó chia.

25 * 100/50 = 2500/50 = 50 

Bạn cũng có thể sử dụng dấu chấm động số học một cách rõ ràng bằng cách xác định một dấu thập phân như trong:

25.0/50.0 * 100 = 0.5 * 100 = 50 
+1

Cảm ơn các bạn! Tôi đã tính toán tỷ lệ phần trăm đã hoàn thành khi mở một tập tin trong open-uri. Dưới đây là những gì tôi đã sử dụng: percent = (file_downloaded.to_f/file_length.to_f) * 100 – RyanScottLewis

+0

Sử dụng biểu mẫu thứ hai sau đó. Nó dễ dàng hơn là cố gắng chuyển đổi sang số dấu phẩy động. –

+0

Hay đúng hơn là giải pháp đầu tiên. Nhân rồi chia một. Bạn có hiểu ý tôi. –

9

Bởi vì bạn đang chia một số nguyên do một số nguyên, vì vậy kết quả là nhận được cắt ngắn để nguyên (0,5 -> 0) trước khi bắt nhân với 100.

Nhưng công trình này:

>> (25/50) * 100 
=> 0 
>> (25.0/50) * 100 
=> 50.0 
+0

Đây là một lời giải thích tuyệt vời. Nói cách khác, nếu câu trả lời cho tính toán của bạn là LESS thì 1 ... Ruby sẽ làm cho nó 0. – FlyingV

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