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

news2024/11/28 16:48:18

前言

有个人跟我说浮点数运算起来非常麻烦,总是算着算着丢失精度,导致计算结果取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.coloradmin.cn/o/1576841.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

GD32零基础教程第三节(模块化编程封装LED模块)

文章目录 前言一、模块化编程概念二、创建HardWare文件夹管理硬件模块文件三、编写led.c和led.h文件总结 前言 模块化编程是将一个大型系统分解为更小、更易管理的模块或组件的过程。每个模块都有明确定义的接口和功能&#xff0c;可以独立开发、测试和维护。那么本篇文章将带…

相位导数方差计算-matlab

%% 下面计算 相位导数方差% 假设 phase_map 是你的相位图二维矩阵 % K 是窗口的大小 k 3; % 请使用实际的窗口大小替换% 计算 x 和 y 方向的偏导 [dx, dy] gradient(wrappedPhase); Ksq k^2; % 计算 K^2half_k floor(k / 2);% 初始化结果矩阵 result zeros(size(wrappedPh…

蓝桥杯刷题--RDay6

特殊日期 3.特殊日期 - 蓝桥云课 (lanqiao.cn)https://www.lanqiao.cn/problems/2408/learning/?first_category_id1&page1&second_category_id3&tags2023 对于一个日期&#xff0c;我们可以计算出年份的各个数位上的数字之和&#xff0c;也可以分别计算月…

【Django开发】前后端分离美多商城项目第6篇:用户部分,1. 业务说明【附代码文档】

美多商城项目4.0文档完整教程&#xff08;附代码资料&#xff09;主要内容讲述&#xff1a;美多商城&#xff0c;项目准备1.B2B--企业对企业,2.C2C--个人对个人,3.B2C--企业对个人,4.C2B--个人对企业,5.O2O--线上到线下,6.F2C--工厂到个人。项目准备&#xff0c;配置1. 修改set…

单例模式--理解

单例模式 单例模式是指在内存中只会创建且仅创建一次对象的设计模式。在程序中多次使用同一个对象且作用相同时&#xff0c;为了防止频繁地创建对象使得内存飙升&#xff0c;单例模式可以让程序仅在内存中创建一个对象&#xff0c;让所有需要调用的地方都共享这一单例对象。 单…

基于单片机室内温湿度监测系统仿真设计

**单片机设计介绍&#xff0c;基于单片机室内温湿度监测系统仿真设计 文章目录 一 概要二、功能设计设计思路 三、 软件设计原理图 五、 程序六、 文章目录 一 概要 基于单片机室内温湿度监测系统仿真设计的沟通概要主要涉及以下几个方面&#xff1a; 一、项目背景与目标 首…

借助 Aspose.Words,在 C# 中将图片转换为 Word

Microsoft Word 提供了多种用于生成具有增强的格式化功能的文本文档的工具。除了文本格式之外&#xff0c;我们还可以将各种图形元素和图像合并到Word文档中。在某些情况下&#xff0c;我们可能需要将图片或照片插入DOC或DOCX格式的Word文档中。在本文中&#xff0c;我们将学习…

【redis数据同步】redis-shake数据同步全量+增量

redis-shake数据同步 redis-shake是基于redis-port基础上进行改进的一款产品。它支持解析、恢复、备份、同步四个功能。以下主要介绍同步sync。 恢复restore&#xff1a;将RDB文件恢复到目的redis数据库。备份dump&#xff1a;将源redis的全量数据通过RDB文件备份起来。解析de…

个推助力小米汽车APP实现智能用户触达,打造智能出行新体验

4月3日&#xff0c;小米SU7首批交付仪式在北京亦庄的小米汽车工厂总装车间举行&#xff0c;全国28城交付中心也同步开启首批交付。随着小米SU7系列汽车的正式发售和交付&#xff0c;小米汽车APP迎来了用户体量的爆发式增长。 小米汽车APP是小米汽车官方推出的手机应用&#xff…

Echarts基础-安装语法高亮插件less-rem转换动态适配大小

Echarts基础-安装语法高亮插件&less-rem转换动态适配大小 基础介绍插件安装教程安装less 插件安装cssrem 插件引入flexibel.js文件 基础介绍 Echarts是一个功能强大的JavaScript开源可视化库&#xff0c;专门用于创建各种图表和数据可视化。 以下是关于Echarts的一些基础介…

区块链技术与数字身份:解析Web3的身份验证系统

在数字化时代&#xff0c;随着个人数据的日益增多和网络安全的日益关注&#xff0c;传统的身份验证系统面临着越来越多的挑战和限制。在这种背景下&#xff0c;区块链技术的出现为解决这一问题提供了全新的思路和解决方案。Web3作为一个去中心化的互联网模式&#xff0c;其身份…

Elasticsearch快速上手

基本概念 索引&#xff08;Index&#xff09; 索引是文档的容器&#xff0c;就像关系数据库中&#xff0c;要存储行记录必须先创建数据库和表一样。 类型&#xff08;Type&#xff09; ES6 及之前的版本还存在”类型“的概念&#xff0c;一个索引下可以存储多个类型的文档&am…

电脑怎么录屏带声音?这么操作就对了!

随着数字化时代的快速发展&#xff0c;电脑录屏带声音的需求逐渐增多。无论是为了制作教学视频、游戏解说&#xff0c;还是为了记录会议内容&#xff0c;一个稳定、易用的录屏工具都是必不可少的&#xff0c;可是电脑怎么录屏带声音呢&#xff1f;本文将介绍两种电脑录屏方法&a…

五一假期来临,各地景区云旅游、慢直播方案设计与平台搭建

一、行业背景 经文化和旅游部数据中心测算&#xff0c;今年清明节假期3天全国国内旅游出游1.19亿人次&#xff0c;按可比口径较2019年同期增长11.5%&#xff1b;国内游客出游花费539.5亿元&#xff0c;较2019年同期增长12.7%。踏青赏花和户外徒步成为假期的热门出游主题。随着…

C++模仿qq界面

#include "mywidget.h"MyWidget::MyWidget(QWidget *parent): QWidget(parent) {//设置窗口的大小this->resize(645,497);//设置窗口名字this->setWindowTitle("QQ");//设置窗口图标this->setWindowIcon(QIcon("C:\\zhouzhouMyfile\\qt_proj…

Java知识体系最强总结(2024版)

博主猫头虎的技术世界 &#x1f31f; 欢迎来到猫头虎的博客 — 探索技术的无限可能&#xff01; 专栏链接&#xff1a; &#x1f517; 精选专栏&#xff1a; 《面试题大全》 — 面试准备的宝典&#xff01;《IDEA开发秘籍》 — 提升你的IDEA技能&#xff01;《100天精通鸿蒙》 …

LLM - 大语言模型(LLM) 的 应用技术

欢迎关注我的CSDN:https://spike.blog.csdn.net/ 本文地址:https://blog.csdn.net/caroline_wendy/article/details/137503579 大语言模型(LLM) 的应用技术范围非常广泛,即: LangChain:开发框架,专为大型语言模型设计,以提高开发人工智能应用的效率,允许开发者将语言模…

基于springboot实现墙绘产品展示交易平台管理系统项目【项目源码+论文说明】

基于springboot实现墙绘产品展示交易平台系统演示 摘要 现代经济快节奏发展以及不断完善升级的信息化技术&#xff0c;让传统数据信息的管理升级为软件存储&#xff0c;归纳&#xff0c;集中处理数据信息的管理方式。本墙绘产品展示交易平台就是在这样的大环境下诞生&#xff…

蓝桥杯练习系统(算法训练)ALGO-958 P0704回文数和质数

资源限制 内存限制&#xff1a;256.0MB C/C时间限制&#xff1a;1.0s Java时间限制&#xff1a;3.0s Python时间限制&#xff1a;5.0s 一个数如果从左往右读和从右往左读数字是完全相同的&#xff0c;则称这个数为回文数&#xff0c;比如898,1221,15651都是回文数。编写…

[STL-list]介绍、与vector的对比、模拟实现的迭代器问题

一、list使用介绍 list的底层是带头双向链表结构&#xff0c;双向链表中每个元素存储在互不相关的独立节点中&#xff0c;在节点中通过指针指向其前一个元素和后一个元素。与其他的序列式容器相比(array&#xff0c;vector&#xff0c;deque)&#xff0c;list通常在任意位置进行…