apache-spark - 在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
.
我怎样才能避免这种精度损失。
解决方案
推荐阅读
- laravel - 如何在laravel中重定向到客户登录页面
- .net - Docker Environment 多容器结构中 PostgreSQL 和 .Net Core 的 docker-compose 文件应该如何配置?
- python - 如何在 Python 中使用映射泛型
- c# - 不知道如何遍历 DbContext 中的类型,一般调用 ToListAsync
- python - 特征选择大大降低了准确性
- javascript - 将多个输入字段实时更新到多个跨度标签
- c - 对 read() 系统调用感到困惑
- sql - 有没有办法按每滚动 24 小时对时间戳进行分组,以便我可以在 Snowflake 中检索总和?
- vue.js - Jest 和 Vue 的覆盖率报告不起作用
- python - Django html 检查表单类型