2015-12-18 14 views
8

Đề cập đến các tài liệu của BigDecimal lớp,Cho dù sử dụng String hoặc Integer trong BigDecimal trong Ruby

n,m = a.precs
prec lợi nhuận số chữ số có nghĩa (n) và số lượng tối đa của chữ số có nghĩa (m) của a.

Tôi đang bối rối bởi kết quả sau có liên quan đến BigDecimal.

require 'bigdecimal'  
BigDecimal.new('1').precs # => [9, 18] 
BigDecimal.new(1).precs # => [9, 27] 

Tôi không thể hiểu tại sao khi một String được thông qua, số lượng tối đa của chữ số có nghĩa là ít hơn so với khi một Fixnum được thông qua.

Ngoài ra nó sẽ dẫn đến bất kỳ vấn đề chính xác nào không?

+0

Trình tạo lập tham số thứ hai nếu bạn muốn nhất quán: 'BigDecimal.new ('1', 27) .precs' chẳng hạn. Và tài liệu này nói rằng "số chữ số có nghĩa được xác định từ giá trị ban đầu" nếu bạn không tự xác định. –

+0

@muistooshort quyền của bạn mà chúng tôi có thể chỉ định điều đó. Nhưng câu hỏi của tôi là tại sao 'precs' lại khác ở nơi đầu tiên? – abhinavmsra

+3

Dưới đây là các điểm dữ liệu khác. Các quan sát sau đây chỉ các chuỗi chứa ký tự '1' chỉ (ví dụ:' "111111" ') và các số có chữ số là tất cả' 1' (ví dụ: '111111'). Đối với ít hơn '10' ký tự,' [9,18] 'được trả về. Đối với ít hơn '10' chữ số,' [9,27] 'được trả về. Giữa '10' và' 18' ký tự * hoặc * chữ số, '[18,27]' được trả về (tức là, cùng một bộ được trả về cho cả chuỗi và số), giữa '19' và một số ký tự hoặc số lớn hơn , '[27,36]' được trả về. Ngoài ra: Tôi đề nghị bạn thêm 'require 'bigdecimal'' vào mã của bạn. –

Trả lời

3

Nếu bạn có thể đọc mã C, bạn có thể bắt đầu tại https://github.com/ruby/ruby/blob/trunk/ext/bigdecimal/bigdecimal.c#L2509 - đó là trình khởi tạo cho bất kỳ đối tượng BigDecimal nào. Nếu bạn làm theo mã đó với phương thức tiếp theo, là BigDecimal_new, bạn sẽ nhận thấy rằng khi thông qua một đối số nguyên có một vài bước cần thực hiện trước khi phân bổ và tạo một đối tượng thập phân lớn bên trong trái ngược với khi truyền đối số chuỗi.

Trong mọi trường hợp, bạn không nên lo lắng về việc mất độ chính xác - các thuộc tính chữ số quan trọng giống như gợi ý hơn giá trị tuyệt đối. Ngay cả tài liệu đề cập đến nó: The actual number of significant digits used in computation is usually larger than the specified number.

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