2012-09-13 74 views
16

Tôi đang cố gắng lấy một phần thập phân của một số thập phân trong đường ray. Ví dụ tôi có một số, rằng "1,23" và tôi muốn có được "23" Nó có thể là quá dễ dàng nhưng, không ai có bất kỳ ý tưởng về làm thế nào tôi có thể làm gì?lấy phần thập phân của số thập phân

Trả lời

7

Tôi không chắc đó có phải là cách dễ nhất để làm điều đó hay không - nhưng bạn có thể chỉ cần chia số bằng cách sử dụng "." nhân vật - như thế này:

number = 1.23 
parts = number.to_s.split(".") 
result = parts.count > 1 ? parts[1].to_s : 0 
+0

hoạt động! cảm ơn EfratBlaier. – yagmurdursun

+3

Người đọc trong tương lai, vui lòng không sử dụng phương pháp này. Nó có thể làm việc trong một trường hợp đơn giản, nhưng sẽ có chuyến đi trong bất kỳ kịch bản nhận thức cục bộ nào. Mặc dù không phải là rất dễ bị lỗi trong Ruby mà hardcodes '.' như dấu phân cách dấu chấm động, nó sẽ thúc đẩy thói quen xấu được sử dụng với các ngôn ngữ khác, ít tha thứ.Vui lòng sử dụng các hàm toán học cho các phép toán, xem các câu trả lời dưới đây. –

37

Cố gắng sử dụng phương pháp modulo:

1.23.modulo(1) => 0.23 

đọc thêm ở đây: http://www.ruby-doc.org/core-1.9.3/Numeric.html#method-i-modulo

Hoặc bạn có thể chuyển đổi phao để nguyên và trừ nó từ giá trị float gốc .

1.23 - 1.23.to_i => 0.23 
+0

cảm ơn Eugene, tôi đã thử nó. – yagmurdursun

+3

Tôi nhận được '(1.1) .modulo (1) # 0.10000000000000009' ít hơn chấp nhận được! –

+0

Và tôi nhận được 1.234 - 1.234.to_i # 0.2399999999999999 ít hơn mức chấp nhận được. Đây là điển hình của điểm động học số học. Vì vậy, là cách tốt nhất của EfratBlaier. – labyrinth

1
a=1.23 #value of a will be 1.23 
a=a-a.to_i #value of a will be 0.23 
2

nếu bạn biết chính xác mong muốn của bạn, điều này có thể là một chút nhanh hơn để giải pháp to_s.

1.1234.modulo(1).round(4) #0.1234 
2

Quyết định giải pháp thích hợp yêu cầu hiểu loại bạn đang làm việc. Nếu các giá trị của bạn là Float (loại tiêu chuẩn cho các số không phải toàn bộ trong Ruby) thì các câu trả lời đúng về mặt logic như mod(1) có thể tạo ra các kết quả không mong muốn do floating point errors. Đối với bất kỳ trường hợp Float là loại dữ liệu thích hợp để sử dụng ở nơi đầu tiên, điều này có thể chấp nhận được.

Nếu lỗi dấu phẩy động là không chấp nhận được, không sử dụng Float! Ruby đi kèm với lớp học tuyệt vời BigDecimal chính xác hơn với chi phí hiệu suất và cú pháp dài hơn một chút.

decimal = BigDecimal.new("1.23") 
decimal.fraC#=> 0.23 
0

Sau khi thử tất cả mọi thứ ... Tôi cảm thấy câu trả lời tốt nhất là (num - num.to_i).abs vì nó cũng làm việc cho số âm.

ví dụ:

(1,23 - 1.23.to_i) .abs = 0,23

(-1,23 - -1.23.to_i) .abs = 0,23

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