移至Spark以获得大十进制时失去精度

时间:2019-03-20 03:56:00

标签: scala apache-spark apache-spark-sql bigdecimal

下面是示例测试代码及其输出。我看到java bigDecimal存储了所有数字,因为scala BigDecimal失去了精度,并进行了四舍五入,而spark也发生了同样的情况。有没有办法设置精度或说永不舍入。无论如何我都不想截断或舍入

val sc = sparkSession
import java.math.BigDecimal
import sc.implicits._

val bigNum : BigDecimal = new BigDecimal(0.02498934809987987982348902384928349)
val convertedNum: scala.math.BigDecimal = scala.math.BigDecimal(bigNum)
val scalaBigNum: scala.math.BigDecimal = scala.math.BigDecimal(0.02498934809987987982348902384928349)

println("Big num in java" + bigNum)
println("Converted " + convertedNum)
println("Big num in scala " + scalaBigNum)

val ds = List(scalaBigNum).toDS()
println(ds.head)
println(ds.toDF.head)

输出

  1. java0.0249893480998798801773208566601169169877685606479644775390625中的大数字
  2. 已转换0.0249893480998798801773208566601169169685685606479644775390625
  3. scala中的大数字0.02498934809987988
  4. 0.024989348099879880
  5. [0.024989348099879880]

1 个答案:

答案 0 :(得分:0)

基于spark.apache.org/docs

  • 精度可以高达38,比例尺也可以高达38(小于或等于精度)。默认精度和小数位数为(10,0)。

此处:https://www.scala-lang.org/api/2.12.5/scala/math/BigDecimal.html

但是,如果您希望以简单的方式将其转换为String, 转换为DF or DS以获得精确值。 :)

请尝试一下:)