舍入双精度值并转换为整数

Posted

技术标签:

【中文标题】舍入双精度值并转换为整数【英文标题】:Round double values and cast as integers 【发布时间】:2018-06-01 04:54:37 【问题描述】:

我在 PySpark 中有一个如下所示的数据框。

import pyspark.sql.functions as func

df = sqlContext.createDataFrame(
        [(0.0, 0.2, 3.45631),
         (0.4, 1.4, 2.82945),
         (0.5, 1.9, 7.76261),
         (0.6, 0.9, 2.76790),
         (1.2, 1.0, 9.87984)],
         ["col1", "col2", "col3"])

df.show()
+----+----+-------+ 
|col1|col2|   col3|
+----+----+-------+
| 0.0| 0.2|3.45631| 
| 0.4| 1.4|2.82945|
| 0.5| 1.9|7.76261| 
| 0.6| 0.9| 2.7679| 
| 1.2| 1.0|9.87984| 
+----+----+-------+

# round 'col3' in a new column:
df2 = df.withColumn("col4", func.round(df["col3"], 2))
df2.show()

+----+----+-------+----+
|col1|col2|   col3|col4|
+----+----+-------+----+
| 0.0| 0.2|3.45631|3.46|
| 0.4| 1.4|2.82945|2.83|
| 0.5| 1.9|7.76261|7.76|
| 0.6| 0.9| 2.7679|2.77|
| 1.2| 1.0|9.87984|9.88|
+----+----+-------+----+

在上面的数据框中col4double。现在我想将col4 转换为Integer

df2 = df.withColumn("col4", func.round(df["col3"], 2).cast('integer'))

+----+----+-------+----+
|col1|col2|   col3|col4|
+----+----+-------+----+
| 0.0| 0.2|3.45631|   3|
| 0.4| 1.4|2.82945|   2|
| 0.5| 1.9|7.76261|   7|
| 0.6| 0.9| 2.7679|   2|
| 1.2| 1.0|9.87984|   9|
+----+----+-------+----+

但我想将 col4 值四舍五入到最接近的值

expected result

+----+----+-------+----+
|col1|col2|   col3|col4|
+----+----+-------+----+
| 0.0| 0.2|3.45631|   3|
| 0.4| 1.4|2.82945|   3|
| 0.5| 1.9|7.76261|   8|
| 0.6| 0.9| 2.7679|   3|
| 1.2| 1.0|9.87984|  10|
+----+----+-------+----+

我该怎么做?

【问题讨论】:

【参考方案1】:

您应该使用round 函数,然后转换为整数类型。但是,不要对round 函数使用第二个参数。通过使用 2 将舍入到小数点后 2 位,然后将 cast 转换为整数将向下舍入到最接近的数字。

改为使用:

df2 = df.withColumn("col4", func.round(df["col3"]).cast('integer'))

【讨论】:

只是一个小疑问在这里,当我们将1.5 舍入时,它变为2 正确。有没有办法让我们可以round 0.41 等等 @Question_bank:是的,这是可能的。而不是round,您将希望使用ceil 函数来进行四舍五入。 @Shaido 的回答很中肯!我有同样的问题,我知道用小数点后 2 位四舍五入,你以 2 位小数四舍五入(例如 2.891 --> 2.89),然后用整数转换截断数字。另一方面,当您不使用小数位时,它会以 0 小数(例如 2.891 --> 3.0)四舍五入,然后通过整数转换获得预期结果。 请注意负数。使用 ceil() 时 -14.05 变为 -14。

以上是关于舍入双精度值并转换为整数的主要内容,如果未能解决你的问题,请参考以下文章

java中的舍入双[重复]

变体浮点到双精度值转换,舍入到小数点后 1 位 [重复]

1.2浮点数向零舍入

Powershell:将分数转换为整数 - 令人惊讶的舍入行为

将双精度转换为字符数组 C++

用指数舍入一个双精度值