【代码】C语言|保留小数点后n位并四舍五入,便于处理运算和存储不善的浮点数

前言

有个人跟我说浮点数运算起来非常麻烦,总是算着算着丢失精度,导致计算结果取int的时候取不准。毕竟系统也没有自动根据这个数的精度四舍五入的功能。
比如int(2.999999999999999)=2,但是float(2.999999999999999)=3.000000。

我觉得这个问题很好解决,正好网上一搜这个问题的答主并没有给出完整且正常的代码,只提到了可以用“round”处理,或者自己手搓了一个round,让我震撼。所以我就简单写了一下这篇博客。

文章目录

    • 前言
    • 小数点后n位取整的思路
      • 思路1 利用round
        • 思路实现
        • 思路的优势和问题
      • 思路2 利用字符串相关函数处理
        • 思路实现
        • 思路优势和问题
      • 思路3 利用float降低精度
        • 思路实现
        • 思路优势和问题

小数点后n位取整的思路

思路1 利用round

思路实现
  1. round这个函数在这个问题里的作用:round只能对小数点后面那一位做四舍五入,没办法舍入第n位。但是我们可以利用这个特性去做。
  2. 直观的思路简述: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这个思路比较清奇,是我随便想的。

  1. 思路来源:字符串可以做截断;
  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的。

  1. 思路核心:float的精度比double低
  2. 思路简述: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这种精度要求。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/587481.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2024最新软件测试【测试理论+ 抓包与网络协议】面试题(内附答案)

一、测试理论 3.1 你们原来项目的测试流程是怎么样的? 我们的测试流程主要有三个阶段&#xff1a;需求了解分析、测试准备、测试执行。 1、需求了解分析阶段 我们的 SE 会把需求文档给我们自己先去了解一到两天这样&#xff0c;之后我们会有一个需求澄清会议&#xff0c; …

升级一下电脑,CPU换I5-14600K,主板换华硕B760M

刚给自己电脑升级了一下&#xff0c;CPU从 AMD R5 5600X 换成 Intel I5-14600K&#xff0c;主板换成了华硕的 TUF GAMING B760M-PLUS WIFI D4。 因为我现有的两根内存是DDR4的&#xff0c;所有我选了个支持DDR4内存的主板。 我发现用AMD处理器时将系统从Win10升级到Win11后变…

【论文阅读】Transformer 论文逐段精读

Transformer 论文逐段精读【论文精读】 文章目录 Transformer 论文逐段精读【论文精读】&#x1f4dd;摘要&#x1f4dc;结论&#x1f4cc;引言⏱️相关工作⭐模型Overview3.1 Encoder and Decoder Stacks3.2 Attention3.2.1 Scaled Dot-Product Attention3.3.2 Multi-head att…

详解人工智能(概念、发展、机遇与挑战)

前言 人工智能&#xff08;Artificial Intelligence&#xff0c;简称AI&#xff09;是一门新兴的技术科学&#xff0c;是指通过模拟、延伸和扩展人类智能的理论、方法、技术和应用系统&#xff0c;以实现对人类认知、决策、规划、学习、交流、创造等智能行为的模拟、延伸和扩展…

最优算法100例之22-变态跳台阶

专栏主页:计算机专业基础知识总结(适用于期末复习考研刷题求职面试)系列文章https://blog.csdn.net/seeker1994/category_12585732.html 题目描述 一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。 题解报告 …

视频汇聚/安防监控/EasyCVR平台播放器EasyPlayer更新:新增【性能面板】

视频汇聚/安防监控/视频存储平台EasyCVR基于云边端架构&#xff0c;可以在复杂的网络环境中快速、灵活部署&#xff0c;平台视频能力丰富&#xff0c;可以提供实时远程视频监控、视频录像、录像回放与存储、告警、语音对讲、云台控制、平台级联、磁盘阵列存储、视频集中存储、云…

ctf_show笔记篇(web入门---jwt)

目录 jwt简介 web345&#xff1a; web346&#xff1a; web347&#xff1a; web348: web349&#xff1a; web350&#xff1a; jwt简介 JSON Web Token&#xff08;JWT&#xff09;通常由三部分组成 Header&#xff08;头部&#xff09;&#xff1a;包含了两部分信息&…

【性能调优】Java服务端性能优化与实战

一、背景 降本增效&#xff1a;随着公司业务的发展和用户规模的增加&#xff0c;当前服务的QPS已经远远不能满足业务需求&#xff0c;需要申请更多CPU资源&#xff0c;来提升QPS&#xff0c;满足业务发展&#xff0c;但是公司硬件资源有限&#xff0c;额外申请多余资源&#x…

【考研数学】武忠祥全程学习包(附资源分享)

跟武忠祥&#xff0c;讲义方面选择基础篇和辅导讲义即可。分别在基础阶段和强化阶段使用。 此外复习全书不用买&#xff08;无论是基础篇还是提高篇都不用&#xff09;你以后可能会看到它的各种推广&#xff0c;不要轻信&#xff0c;有讲义的情况下全书很难利用得上。 武忠祥…

电机控制器电路板布局布线参考指导(二)

电机控制器电路板布局布线参考指导&#xff08;二&#xff09;热特性 1.概述2.PCB传导与对流3.连续顶层散热焊盘4.覆铜厚度5.散热过孔连接6.散热过孔宽度7.电机控制器电路板热设计总结 1.概述 电机驱动器并不是理想的器件&#xff0c;在实际应用中&#xff0c;它们的一些功率会…

在ScadaFramework里配置采集Modbus设备

ScadaFramework是一个实现SCADA功能的软件工具&#xff0c;经过简单配置之后&#xff0c;即可采集设备数据&#xff0c;并进行存储、监控、组态可视化&#xff0c;并可将数据上传至平台。 本文将介绍如何在ScadaFramework中配置&#xff0c;以采集Modbus协议的设备。 一、添加链…

MySQL之索引详细总结

索引简介 索引是帮助MySQL高效获取数据的数据结构(有序)。在数据之外&#xff0c;数据库系统还维护着满足特定查找算法的数据结构&#xff0c;这些数据结构以某种方式引用(指向)数据&#xff0c;这样就可以在这些数据结构上实现高级查法&#xff0c;这种数据结构就是索引 为什…