7

Doublesからsへの変換の状況はBigDecimalJavaと比較して少し改善されていますが

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)

このように文字列をBigDecimalsに変換できるデフォルトで利用可能ですか?

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

または、何かが足りないので、ScalaはJavaのすべての「問題」を、の代わりに浮動小数点値を持つコンストラクターを使用して解決しましたBigDecimal。基本的に、Scalaではもう必要ありません。StringBigDecimal(String)

4

2 に答える 2

8

これは考えられていましたが、あいまいな変換が作成されたため、明らかにロールバックされました。scala-listのこのスレッドを参照してください。

スレッドは古いですが、私が見る限り、string2Bigdecimalはまだ暗黙的なとして定義されていません

それでもstring2BigDecimal個人的な使用のためにローカルを暗黙的に使用したい場合:

  • 暗黙のスコープのルールは、仕様§7.2に記載されています。
  • あいまいさを解決するにはstring2BigDecimal、サブクラス化を使用して定義する必要があります。例についてはこのペーパー (§6.5)を、説明についてはこのペーパー(§あいまいさの回避)を参照してください。
于 2011-01-16T11:51:22.843 に答える
3

なぜなら、aBigDecimal常にDoubleaまたはaから作成できますFloatが、必ずしもStringから作成できるとは限らないからです。一般に、何かがこの「プロパティ」を持っている場合、明示的な暗黙のを使用することをお勧めします。たとえば、これはいいでしょう:

"1.23".toBigDecimal
于 2011-01-16T19:54:28.380 に答える