舍入双精度值并转换为整数
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|
+----+----+-------+----+
在上面的数据框中col4
是double
。现在我想将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.4
到1
等等
@Question_bank:是的,这是可能的。而不是round
,您将希望使用ceil
函数来进行四舍五入。
@Shaido 的回答很中肯!我有同样的问题,我知道用小数点后 2 位四舍五入,你以 2 位小数四舍五入(例如 2.891 --> 2.89),然后用整数转换截断数字。另一方面,当您不使用小数位时,它会以 0 小数(例如 2.891 --> 3.0)四舍五入,然后通过整数转换获得预期结果。
请注意负数。使用 ceil() 时 -14.05 变为 -14。以上是关于舍入双精度值并转换为整数的主要内容,如果未能解决你的问题,请参考以下文章