移动到Spark以获得大小数时丢失精度

问题描述 投票:0回答:1

下面是示例测试代码及其输出。我看到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.0249893480998798801773208566601169877685606479644775390625
  2. 已转换0.0249893480998798801773208566601169877685606479644775390625
  3. 大是否梯子0.02498934809987988
  4. 0.024989348099879880
  5. [0.024989348099879880]
scala apache-spark apache-spark-sql bigdecimal
1个回答
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以获得精确值。 :)

如果你想要试试:)

© www.soinside.com 2019 - 2024. All rights reserved.