2011-01-16 7 views
5
Double에서 BigDecimal 로의 변환의 상황이 Java

왜 Float/Double에서 BigDecimal로 암시 적으로 변환 되나 String에서는 암시 적으로 변환되지 않습니까?

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

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

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

와 같은 것보다 조금 개선되었지만 실제로는 잘 작동합니다. 암시 적으로 처리하는 것이 합리적이지 않습니까?

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

와 같은 변환은 String을 BigDecimal로 변환 할 수 있습니까?

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

아니면 스칼라는 String 대신 부동 소수점 값을 사용하여 BigDecimal 생성자를 사용하여 Java의 모든 "문제"를 해결했으며 스칼라에서는 기본적으로 BigDecimal(String)가 더 이상 필요하지 않습니다.

+0

이것은 Java 언어 자체와 관련이 거의 없으며 "Java"태그가 있어야하는 이유는 무엇입니까? – MAK

답변

7

이것은 thought of 이었지만 모호한 변환을 생성했기 때문에 rolled back이었습니다. this thread on the scala-list을 참조하십시오.

스레드는 오래되었지만 볼 수있는 한 string2Bigdecimal은 still not defined as an implicit입니다.

당신은 여전히 ​​귀하의 개인 사용을 위해 로컬 string2BigDecimal 암시를 원한다면 :

  • 암시 적 범위에 대한 규정이 §7.2, 사양에서 찾을 수 있습니다,
  • 는 찬성 모호성을 해결하기 위해 당신의 string2BigDecimal의 경우 서브 클래스를 사용하여 정의해야합니다 (예 : this paper (§6.5)). 설명은 this one피할 수없는 모호함)을 참조하십시오.
+0

이것은 꽤 오래 전에 발생했습니다. 나는 의미있는 시간에 상속에 대한 함축의 "우선 순위"를 정의 할 수 있다는 것에 대해 기억하고 있습니다. 그게 여기서 일하지 않겠 니? 아니면 완전히 다른 것입니까? – soc

+0

답변을 업데이트했습니다. 나는 이것이 당신의 우려에 응답하기를 바랍니다. – huitseeker

+0

고마워요! ... – soc

2

BigDecimal항상이 문자열에서 Double 또는 Float하지만 항상 하지에서 생성 될 수 있기 때문에. 일반적으로 암시 적 암시 적을 사용하는이 "속성"이있는 곳이면 좋습니다. 예를 들어, 이것은 좋을 것입니다.

"1.23".toBigDecimal 
+0

그렇습니다. 그것은 확실히 유효한 관심사이며 [이 이전 질문] (http://stackoverflow.com/questions/1404889/scala-implicit-usage-choices)의 권장 사항은 확실히 최상위 ' string2BigDecimal' 암시 적입니다. – huitseeker

관련 문제