首页 > 解决方案 > 在pyspark中加载超过54位小数的double类型时如何避免精度损失

问题描述

我正在确定 spark 是否接受 Oracle 的 FLOAT(126) 持有的极值。我正在将最小浮点值 2^-126 加载到 spark 数据框中的 Double 类型列中。从数据帧读取时,小数部分在 54 位后四舍五入。

请看下面的代码:

>>> df = spark.createDataFrame([(float(0.000000000000000000000000000000000000011754943508222875079687365372222456778186655567720875215087517062784172594547271728515625),)], ['flt_val']) ```

>>> df.printSchema()
root
 |-- flt_val: double (nullable = true)


>>> df.select(f.format_number(f.col('flt_val'), 126), 'flt_val').show(truncate=False)
+--------------------------------------------------------------------------------------------------------------------------------+----------------------+
|format_number(flt_val, 126)                                                                                                     |flt_val               |
+--------------------------------------------------------------------------------------------------------------------------------+----------------------+
|0.000000000000000000000000000000000000011754943508222875000000000000000000000000000000000000000000000000000000000000000000000000|1.1754943508222875E-38|
+--------------------------------------------------------------------------------------------------------------------------------+----------------------+


如您所见,按原样显示数字和格式化值都在11754943508222875.

我怎样才能避免这种精度损失。

标签: apache-sparkpysparkdoubleprecision

解决方案


推荐阅读