【代码】C语言|保留小数点后n位并四舍五入,便于处理运算和存储不善的浮点数
前言
有个人跟我说浮点数运算起来非常麻烦,总是算着算着丢失精度,导致计算结果取int的时候取不准。毕竟系统也没有自动根据这个数的精度四舍五入的功能。
比如int(2.999999999999999)=2,但是float(2.999999999999999)=3.000000。
我觉得这个问题很好解决,正好网上一搜这个问题的答主并没有给出完整且正常的代码,只提到了可以用“round”处理,或者自己手搓了一个round,让我震撼。所以我就简单写了一下这篇博客。
文章目录
小数点后n位取整的思路
思路1 利用round
思路实现
- round这个函数在这个问题里的作用:round只能对小数点后面那一位做四舍五入,没办法舍入第n位。但是我们可以利用这个特性去做。
- 直观的思路简述:
int(float(val,n),10)
,意思是取n位小数的val的值,然后转成int,从而完成满足n精度要求的int整型转换。
代码我让gpt给我写了一下:
可用的代码如下:
#include <stdio.h>
#include <math.h>
double roundToNDecimalPlaces(double num, int n) {
double factor = pow(10, n);
return round(num * factor) / factor;
}
int main() {
double num = 9.99999999;
int n = 3;
double result = roundToNDecimalPlaces(num, n);
printf("Result: %.3f\n", result);
return 0;
}
编译方式(需要通过在编译命令中添加 -lm 选项来链接数学库):
gcc test_round.c -o test_round -lm
运行结果就是Result: 10.000
。
当然,你如果希望简洁一点,也可以把代码写成:int(round(val*pow(10,n)/pow(10,n)))
。
思路的优势和问题
优势:能实现n位存储精度。
问题:pow的数值过大的时候会超过double的有效数字表示能力。很多时候pow(10,5)就会溢出了。
思路2 利用字符串相关函数处理
思路实现
思路2这个思路比较清奇,是我随便想的。
- 思路来源:字符串可以做截断;
- 思路简述:
int(str(float(vv)),10)
,就是利用sprintf的功能先转成str,然后取str的那几位再int向下取整。
照旧是让GPT写的,提问过程就不截图了,具体代码如下:
#include <stdio.h>
#include <stdlib.h>
double roundToNDecimalPlaces(double num, int n) {
char format[20];
sprintf(format, "%%.%df", n); // 构造格式字符串,保留n位小数
char str[50];
sprintf(str, format, num); // 将浮点数转换为字符串
return atof(str); // 将字符串转换回浮点数
}
int main() {
double num = 9.99999999;
int n = 3;
double result = roundToNDecimalPlaces(num, n);
printf("Result: %.3f\n", result);
return 0;
}
运行结果就是Result: 10.000
。
思路优势和问题
优势:能充分利用现有的计算机制,并且能够达到任意高的存储精度要求。
缺点:有的实现里面可能无法调用sprintf这个函数,并且sprintf这个函数运算速度不是很快。
思路3 利用float降低精度
思路实现
思路3是脱胎于思路1的。
- 思路核心:float的精度比double低
- 思路简述:
int(float(val))
。就是先把double类型的val数据强制转换为float给它丢失一下精度,然后再转int。这个实现思路只能保证float这么大的精度大小。
实现代码:
#include <stdio.h>
int roundToFloat(double num) {
return (int)(float)num;
}
int main() {
double num = 9.9999999;
float temp = (float)num;
int result = roundToFloat(num);
printf("Temp: %f, Result: %d\n", temp, result);
return 0;
}
运行结果:Temp: 10.000000, Result: 10
。
思路优势和问题
优势:算得超级快。
问题:只能满足float这种精度要求。
【代码】C语言|保留小数点后n位并四舍五入,便于处理运算和存储不善的浮点数的更多相关文章
- 实现js保留小数点后N位的代码
在JS中,一般实现保留小数点后N位的话,都是利用toFixed函数 <script language="javascript"> document.write(&quo ...
- php number_format()保留小数点后几位
[PHP_保留两位小数的相关函数] php保留两位小数并且四舍五入 Php代码 1 $num = 123213.666666; 2 echo sprintf("%.2f ...
- js保留小数点后N位的方法介绍
js保留小数点后N位的方法介绍 利用toFixed函数 代码如下 复制代码 <script language="javascript"> document.write( ...
- 格式化 float 类型,保留小数点后1位
""" 练习 : 小明的成绩从去年的72分提升到了今年的85分,请计算小明成绩提升的百分点, 并用字符串格式化显示出'xx.x%',只保留小数点后1位: &qu ...
- 关于Oracle中查询的数字值的显示格式需要保留小数点后两位(或者三位,及其他位数)
关于Oracle中查询的数字值的显示格式需要保留小数点后两位(或者三位,及其... 方法一:使用to_char的fm格式,即: to_char(round(data.amount,2),'FM9999 ...
- input内强制保留小数点后两位 位数不足时自动补0
input内强制保留小数点后两位 位数不足时自动补0 小数点后位数超出2位时进行四舍五入 需引入jquery包 1.11.2版本 1 function xiaoshu(x) 2 { 3 var f = ...
- JAVA除法保留小数点后两位的两种方法 Java Math的 floor,round和ceil的总结
floor 返回不大于的最大整数 round 则是4舍5入的计算,入的时候是到大于它的整数round方法,它表示“四舍五入”,算法为Math.floor(x+0.5),即将原来的数字加上0.5后再向下 ...
- php number_format()保留小数点后几位有效数的函数 千位分组来格式化数字(转)
PHP保留小数点后2位的函数number_format number_format(带小数点的书,小数点后保留的位数) number_format(8.3486,2); //取得小数点后2位有效数/ ...
- C#保留小数点后几位
String.Format("{0:N1}", a) 保留小数点后一位 String.Format("{0:N2}", a) 保留小数点后两位 String.F ...
- Javascript 智能输入数字且保留小数点后三位
html: <input type="text" name="cprice" placeholder="最多保留小数点后三位" onk ...
随机推荐
- LINUX手动安装万里开源单实例
下载安装包 https://gitee.com/GreatSQL/GreatSQL/releases/ 关闭 selinux 和防火墙 #关闭selinux $ setenforce=0 $ sed ...
- C#/.NET/.NET Core技术前沿周刊 | 第 25 期(2025年2.1-2.9)
前言 C#/.NET/.NET Core技术前沿周刊,你的每周技术指南针!记录.追踪C#/.NET/.NET Core领域.生态的每周最新.最实用.最有价值的技术文章.社区动态.优质项目和学习资源等. ...
- Maomi.MQ 2.0 | 功能强大的 .NET 消息队列通讯模型框架
说明 作者:痴者工良 文档地址:https://mmq.whuanle.cn 仓库地址:https://github.com/whuanle/Maomi.MQ 作者博客: https://www.wh ...
- DeepSeek引发创业的思考
2025年春节最火的就是DeepSeek,就像08年小沈阳的火一样,越来越多的不是Ai这个行业的人开始越来越关注Ai,作为一个一直从事Ai的工作者,看到了ChatGPT的涌现后,中国再次冲出来的中国式 ...
- Flink学习(十六) ProcessFunctionAPI(底层API)
我们之前学习的转换算子是无法访问时间的时间戳信息和水位线信息的.而这些在一些应用场景下,极为重要,例如MapFunction这样的map转换算子就无法访问时间戳或者当前事件的事件时间. 基于此,Dat ...
- MyCat分库分表-主从
一.MySQL数据同步 1.主节点配置,log-bin,指定文件名称 2.主节点配置server-id,默认为1 vim /etc/my.cof 在[mysqld]下添加如下配置 log-bin=im ...
- php连接sql server 2014踩坑及处理记录
1.PDOException: SQLSTATE[42S02]: [Microsoft][ODBC Driver 17 for SQL Server][SQL Server]对象名 'dbotest' ...
- 关于Mysql触发器的使用
当我在回复表新增数据 我就会执行下列语句 触发器在mysql的使用过DELIMITER $$开头 END; $$ 结尾,注意 触发的语句必须用:结尾 创建触发器DELIMITER $$CREATE T ...
- 震惊!AI 编程竟然让程序员 “失业” 了?真相让人意外
在科技飞速发展的当下,AI 编程的异军突起无疑成为了整个编程领域乃至社会各界热议的焦点. 去年,全球首个AI程序员Devin横空出世,不仅能独立完成代码开发.修复Bug,甚至能通过阅读技术文档自主学习 ...
- JDK 24 发布,新特性解读!
真快啊!Java 24 这两天已经正式发布啦!这是自 Java 21 以来的第三个非长期支持版本,和 Java 22.Java 23一样. 下一个长期支持版是 Java 25,预计今年 9 月份发布. ...