pyspark 保留小数位数-笔记

PySpark中处理数值类型小数位数的方法

pyspark中对于数值类型的值进行小数位数的保存可以通过两种方式处理,一个是select中结合functions里的bround,另一个是selectExpr中的结合round。 pyspark.sql中的functions.bround进行处理。 

方式1 : functions.bround('columnName',scale=value)

scale表示保留的小数位数,四舍五入。

#构建dataframe
rdd = sc.parallelize([("Sam", 28, 88.52, "M"),
                      ("Flora", 28, 90.55, "F"),
                      ("Mey", 1, None, "M"),
                      ("Chery", 7, 80.23, "F")])
test = rdd.toDF(["name", "age", "score", "sex"])
test.show()

from pyspark.sql import functions 
test2= test.select('name','age',functions.bround('score',scale=1).alias('socre'),'sex') # 进行了四舍五入的保留小数位数,scale表示保留的小数位数
test2.show() 

结果:score列 只保留1位小数了

+-----+---+-----+---+
| name|age|socre|sex|
+-----+---+-----+---+
|  Sam| 28| 88.5|  M|
|Flora| 28| 90.6|  F|
|  Mey|  1| null|  M|
|Chery|  7| 80.2|  F|
+-----+---+-----+---+

方式2 selectExpr中 round 

## selectExpr中 round 
test3 = test.selectExpr('name','age','round(score,1) as score','sex')
test3.show()

结果同上: 

+-----+---+-----+---+
| name|age|score|sex|
+-----+---+-----+---+
|  Sam| 28| 88.5|  M|
|Flora| 28| 90.6|  F|
|  Mey|  1| null|  M|
|Chery|  7| 80.2|  F|
+-----+---+-----+---+
<think>我们正在讨论C语言中保留小数位数的方法。用户之前询问了round函数,现在转向如何保留小数位数(例如,输出时控制小数点后的位数)。 根据引用[1],我们可以使用printf函数的格式化输出来控制小数位数,格式为"%.Nf"或"%.Nlf",其中N是保留小数位数。 另外,在C++中我们可能有setprecision(如引用[2]提及),但用户明确询问C语言,因此我们主要关注printf。 但是,用户可能混淆了“保留小数位数”和“四舍五入”的概念。printf的格式化输出会自动进行四舍五入(根据标准,它会按照当前小数位后的第一位进行四舍五入)。 因此,我们只需要使用printf的格式控制即可。 注意:C语言中没有直接保留小数位数的函数,而是通过格式控制输出。如果需要对浮点数进行保留指定位数的运算(而不仅仅是输出),则需要先进行四舍五入运算,然后再输出(或者存储)。 然而,用户的问题明确是“保留小数位数的函数”,在C语言中并没有内置函数可以改变浮点数的存储精度(因为浮点数的存储格式是固定的),我们通常是指输出时控制显示的小数位数。 因此,我们重点介绍printf的格式化输出。 同时,我们可以补充如何对浮点数进行四舍五入到指定小数位数(不仅仅是整数)的方法,因为用户之前问了round函数,而round只能取整。 例如,要将3.14159四舍五入到两位小数,我们可以用:round(x * 100) / 100.0,然后再用printf输出(但要注意浮点精度问题)。 然而,用户引用[1]只提到了printf的格式化输出,它本身就会四舍五入显示。所以,如果只是输出,那么直接使用printf即可。 如果需要对数值本身进行四舍五入到指定位数,则需要用数学运算(乘以10的N次方,取整,再除以10的N次方),但这样会有精度误差。 因此,我们分两种情况: 1. 仅输出时保留小数位数:使用printf格式化。 2. 需要将数值四舍五入到指定小数位数:使用round函数配合幂运算。 根据用户问题,他可能更关注输出,所以我们先介绍第一种。 步骤: 1. 包含头文件stdio.h。 2. 使用printf,格式为"%.Nf"(对于float)或"%.Nlf"(对于double),其中N为要保留小数位数。 注意:实际上,对于double,在printf中"%f"和"%lf"在C99以后是等效的,但为了清晰,通常用"%lf"表示double。 示例代码: 输出一个double类型变量,保留两位小数: double d = 3.14159; printf("%.2lf", d); // 输出3.14 四舍五入到两位小数(3.14159保留两位小数是3.14,而3.145保留两位小数是3.15)。 但是,printf在格式化输出时,是否会自动四舍五入?答案是:会。 例如: double d1 = 3.14159; double d2 = 3.145; printf("%.2lf\n", d1); // 输出3.14 printf("%.2lf\n", d2); // 输出3.15 所以,如果只是为了输出,那么直接使用printf格式化即可。 但是,如果需要在计算中保留指定位数的小数(即改变变量的值),则需要用以下方法: double round_to_decimal(double value, int decimal_places) { double factor = pow(10, decimal_places); return round(value * factor) / factor; } 注意:使用round函数需要math.h,并且链接数学库(-lm)。 然而,由于浮点数的精度问题,这种方法可能并不完美。例如,对于某些十进制小数,在二进制浮点数中无法精确表示,所以可能会产生舍入误差。 因此,对于要求精确的场合(如金融),建议使用整数运算(如用分而不是元)或者使用十进制浮点数库。 总结回答: 在C语言中,保留小数位数的常用方法是通过输出函数(如printf)的格式化控制。例如,保留两位小数:printf("%.2f", num);(对于double,也可以用%.2lf)。这种方法会在输出时自动四舍五入到指定的位数。 如果需要对数值本身进行四舍五入到指定小数位数,可以使用以下公式: 四舍五入后的值 = round(原值 * pow(10, N)) / pow(10, N); 其中N是保留小数位数。 但要注意浮点精度问题。 下面我们给出示例代码。 同时,根据用户之前的引用[1],我们也可以参考其中的示例。 最后,生成相关问题。 </think>### C语言保留小数位数的函数与方法详解 在C语言中,**没有直接保留小数位数的内置函数**,但可以通过以下两种核心方法实现: #### 1. 格式化输出函数:`printf()` 最常用的方法是使用`printf()`的格式控制符,语法为: ```c printf("%.Nf", float_value); // 单精度浮点数 printf("%.Nlf", double_value); // 双精度浮点数 ``` **特性**: - `N`指定保留小数位数(如`%.3f`保留3位) - **自动四舍五入**处理小数位数 - 仅改变输出格式,不修改原变量值 **示例代码**: ```c #include <stdio.h> int main() { double price = 19.9876; printf("默认输出: %f\n", price); // 19.987600 printf("保留1位: %.1lf\n", price); // 20.0 (四舍五入) printf("保留2位: %.2lf\n", price); // 19.99 printf("保留3位: %.3lf\n", price); // 19.988 return 0; } ``` #### 2. 数学运算 + 取整函数(精确数值处理) 需要修改变量值时,结合`round()`函数与幂运算: ```c #include <math.h> double decimal_round(double value, int decimals) { double factor = pow(10, decimals); return round(value * factor) / factor; } ``` **特性**: - 返回四舍五入后的新数值 - 需链接数学库(gcc编译添加`-lm`参数) - 可存储处理后的值供后续计算使用 **示例**: ```c double raw = 3.1415926; double processed = decimal_round(raw, 3); // 得到3.142 printf("原始值: %f\n", raw); // 3.141593 printf("处理后: %.3f\n", processed); // 3.142 ``` #### 关键对比 | 方法 | 是否修改变量值 | 适用场景 | 精度控制 | |------------------|----------------|------------------------|----------| | `printf()`格式化 | 否 | 直接输出结果 | 精确可靠 | | `round()`+幂运算 | 是 | 需要存储或进一步计算 | 可能有浮点误差 | > ⚠️ **浮点精度注意**: > 计算机采用二进制存储小数,部分十进制小数无法精确表示(如`0.1`)。若需高精度计算,建议使用定点数库或整数运算[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值