2011-01-16 21 views
5

Mặc dù tình hình chuyển đổi từ Double s để BigDecimal s đã được cải thiện một chút so với JavaTại sao có một chuyển đổi ngầm từ Float/Đôi thành BigDecimal, nhưng không phải từ chuỗi?

scala> new java.math.BigDecimal(0.2) 
res0: java.math.BigDecimal = 0.20000000000000001110223024625156... 

scala> BigDecimal(0.2) 
res1: scala.math.BigDecimal = 0.2 

và những thứ như

val numbers: List[BigDecimal] = List(1.2, 3.2, 0.7, 0.8, 1.1) 

công việc thực sự tốt, nó sẽ không được hợp lý để có một chuyển đổi tiềm ẩn như

implicit def String2BigDecimal(s: String) = BigDecimal(s) 

có sẵn theo mặc định có thể chuyển đổi chuỗi thành BigDecimals như điều này?

val numbers: List[BigDecimal] = List("1.2", "3.2", "0.7", "0.8", "1.1") 

Hoặc tôi thiếu cái gì đó và Scala giải quyết tất cả các "vấn đề" của Java với việc sử dụng các nhà xây dựng BigDecimal với một giá trị dấu chấm thay vì một StringBigDecimal(String) về cơ bản là không cần thiết nữa trong Scala?

+0

Điều này ít liên quan đến chính ngôn ngữ Java, tại sao nó được gắn thẻ "Java"? – MAK

Trả lời

7

Đây là thought of, nhưng dường như rolled back vì nó tạo ra chuyển đổi mơ hồ. Xem this thread on the scala-list.

Chủ đề cũ, nhưng theo như tôi thấy, string2Bigdecimal là still not defined as an implicit.

Nếu bạn vẫn muốn có một địa phương string2BigDecimal ngầm cho mục đích cá nhân của bạn:

  • các quy tắc cho phạm vi tiềm ẩn có thể được tìm thấy trong các đặc điểm kỹ thuật, §7.2,
  • để giải quyết mập mờ ủng hộ của bạn string2BigDecimal, bạn nên xác định nó bằng cách sử dụng phân lớp con, xem this paper (§6.5) để biết ví dụ và this oneTránh sự mơ hồ) để được giải thích.
+0

Điều này đã xảy ra khá lâu rồi. Tôi nhớ rằng có một cái gì đó về việc có thể xác định một "ưu tiên" của implicits với thừa kế trong thời gian có nghĩa là. Nó sẽ không hoạt động ở đây? Hay cái gì đó hoàn toàn khác? – soc

+0

Tôi đã cập nhật câu trả lời của mình. Tôi hy vọng điều này sẽ giải đáp các thắc mắc của bạn. – huitseeker

+0

Cảm ơn rất nhiều! ... – soc

2

Bởi vì một BigDecimal thể luôn được tạo ra từ một Double hoặc một Float, nhưng không phải lúc nào từ một String. Nói chung, một ý tưởng hay là, khi một thứ gì đó có "thuộc tính" này để sử dụng một số ẩn rõ ràng . Ví dụ: điều này sẽ tốt đẹp:

"1.23".toBigDecimal 
+0

Vâng, đó chắc chắn là một mối quan tâm hợp lệ, và các khuyến nghị của [câu hỏi trước này] (http://stackoverflow.com/questions/1404889/scala-implicit-usage-choices) chắc chắn áp dụng cho việc có một 'toplevel' string2BigDecimal' ngầm định. – huitseeker

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