第十二章--- fixed 和 setprecision 函数、round 函数、进制转换及底层逻辑

1. 保留几位小数

在C++中,如果你想要控制输出的小数点后的位数,可以使用<iomanip>头文件提供的fixedsetprecision函数。这里的fixed用于设置浮点数的输出格式为定点表示法,而setprecision(n)则用来指定小数点后保留的位数。具体用法如下:

#include <iostream>
#include <iomanip> // 引入iomanip头文件int main() {double n = 123.45678;std::cout << std::fixed << std::setprecision(2) << n << "\n"; // 保留2位小数return 0;
}

在这个例子中,n变量的值是123.45678,但是通过std::fixed << std::setprecision(2),我们告诉编译器我们希望输出的小数点后只保留两位,因此输出结果会是123.46(注意这里进行了四舍五入)。

2. 调用中的函数round四舍五入

当你需要对一个浮点数进行四舍五入操作时,可以使用<cmath>头文件中的round函数。这个函数接收一个浮点数作为参数,并返回最接近该数的整数值。如果该数的小数部分大于等于0.5,则向上取整;否则向下取整。例如:

#include <iostream>
#include <cmath> // 引入cmath头文件int main() {double a = 14.7;a = round(a); // 对a进行四舍五入std::cout << a << "\n"; // 输出15return 0;
}

这段代码首先定义了一个双精度浮点数a,然后使用round(a)对其进行四舍五入处理,最后输出结果为15

3. 既保留几位小数又实现四舍五入

有时候,我们不仅需要对数字进行四舍五入,还希望保留特定的小数位数。这时,可以通过先将数字乘以10的幂次方,再进行四舍五入,最后除以相同的10的幂次方来达到目的。例如,要保留两位小数并四舍五入,可以这样做:

#include <iostream>
#include <cmath> // 引入cmath头文件int main() {double a = 14.348;a = round(a * 100) / 100; // 先乘以100,四舍五入后再除以100std::cout << a << "\n"; // 输出14.35return 0;
}

这里的关键步骤是先将a乘以100(因为我们要保留两位小数),这样原本的小数部分就被移动到了整数部分。接着使用round函数进行四舍五入,然后再除以100恢复原来的比例。最终输出的结果就是四舍五入并且保留了两位小数的14.35

4. 进制相互转换

1. 二进制、八进制、十进制、十六进制转换:
#include<iostream>
#include <bitset>        //转换二进制需要添加
using namespace std;
int main()
{cout << "8进制:" << oct << 35 <<"\n";cout << "10进制" << dec << 35 <<"\n";cout << "16进制:" <<hex << 35 << "\n";cout << "2进制: " << bitset<6>(35) <<"\n";   //保留6位输出(根据二进制而定)return 0;
}

这段C++代码展示了如何将一个整数(在这个例子中是35)转换成不同的进制表示形式:八进制、十进制、十六进制以及二进制。下面是对每部分的详细解释:

十进制(Decimal)

十进制是我们最常用的数字系统,它使用10个符号(0-9)。在上面的代码中,35 是一个十进制数。当直接输出 35 时,我们看到的是它的十进制形式。

八进制(Octal)

八进制使用8个符号(0-7)。在C++中,可以通过设置流的基数为八进制来输出一个数的八进制形式。这通过使用 std::oct 完成。例如,在代码中 cout << "8进制:" << oct << 35 <<"\n"; 输出 35 的八进制形式,即 43

十六进制(Hexadecimal)

十六进制使用16个符号(0-9 和 A-F)。A代表10,B代表11,以此类推直到F代表15。在C++中,可以使用 std::hex 设置流的基数为十六进制。代码中的 cout << "16进制:" << hex << 35 << "\n"; 将输出 35 的十六进制形式,即 23

二进制(Binary)

二进制只使用两个符号(0和1)。C++标准库并没有直接提供将数字转换为二进制字符串的功能,但可以使用 <bitset> 头文件提供的 std::bitset 类来实现这一功能。bitset 可以将一个整数转换为其二进制表示,并允许指定输出的位数。在示例代码中,cout << "2进制: " << bitset<6>(35) <<"\n"; 使用了 bitset<6>(35)35 转换为二进制形式,并确保输出至少6位(不足则左补0),因此输出为 100011

总结
  • 十进制:直接输出整数,如 35
  • 八进制:使用 std::oct,输出 43
  • 十六进制:使用 std::hex,输出 23
  • 二进制:使用 std::bitset,输出 100011

这段代码很好地展示了如何在C++中进行不同进制之间的转换。

2. 手动进制转换

手动进行进制之间的转换,以便更好地理解这些转换的过程。

#include <iostream>
#include <bitset>
#include <iomanip> // 用于设置十六进制输出格式using namespace std;// 函数声明
string decimalToBinary(int n);
string decimalToOctal(int n);
string decimalToHex(int n);int main() {int number;cout << "请输入一个整数: ";cin >> number;// 输出不同进制的表示cout << "十进制: " << dec << number << "\n";cout << "八进制: " << oct << number << "\n";cout << "十六进制: " << hex << uppercase << number << "\n"; // uppercase 使十六进制字母大写cout << "二进制: " << bitset<32>(number) << "\n"; // 输出32位二进制数// 手动转换cout << "手动转换 - 二进制: " << decimalToBinary(number) << "\n";cout << "手动转换 - 八进制: " << decimalToOctal(number) << "\n";cout << "手动转换 - 十六进制: " << decimalToHex(number) << "\n";return 0;
}// 将十进制转换为二进制
string decimalToBinary(int n) {string binary = "";while (n > 0) {binary = to_string(n % 2) + binary;n /= 2;}return binary.empty() ? "0" : binary;
}// 将十进制转换为八进制
string decimalToOctal(int n) {string octal = "";while (n > 0) {octal = to_string(n % 8) + octal;n /= 8;}return octal.empty() ? "0" : octal;
}// 将十进制转换为十六进制
string decimalToHex(int n) {string hex = "";const string hexDigits = "0123456789ABCDEF";while (n > 0) {hex = hexDigits[n % 16] + hex;n /= 16;}return hex.empty() ? "0" : hex;
}
代码解析
  1. 用户输入

    • 程序首先提示用户输入一个整数。
  2. 输出不同进制的表示

    • 使用 std::dec, std::oct, std::hex 分别输出十进制、八进制和十六进制的表示。
    • 使用 std::bitset 输出二进制表示,这里输出32位以确保足够的位数。
  3. 手动转换函数

    • decimalToBinary(int n):将十进制数转换为二进制字符串。
    • decimalToOctal(int n):将十进制数转换为八进制字符串。
    • decimalToHex(int n):将十进制数转换为十六进制字符串。
手动转换的逻辑
  • 二进制转换

    • 不断取余数(模2),并将结果拼接到字符串的前面,直到商为0。
  • 八进制转换

    • 不断取余数(模8),并将结果拼接到字符串的前面,直到商为0。
  • 十六进制转换

    • 不断取余数(模16),并将结果转换为对应的十六进制字符(0-9, A-F),拼接到字符串的前面,直到商为0。

运行示例

假设用户输入 35,程序的输出将是:

请输入一个整数: 35
十进制: 35
八进制: 43
十六进制: 23
二进制: 00000000000000000000000000100011
手动转换 - 二进制: 100011
手动转换 - 八进制: 43
手动转换 - 十六进制: 23

以上就是关于C++中如何控制小数位数以及如何进行四舍五入操作与进制相互转换的详细解释。希望这些信息对你有所帮助!

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

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

相关文章

文件上传之%00截断(00截断)以及pikachu靶场

pikachu的文件上传和upload-lab的文件上传 目录 mime type类型 getimagesize 第12关%00截断&#xff0c; 第13关0x00截断 差不多了&#xff0c;今天先学文件上传白名单&#xff0c;在网上看了资料&#xff0c;差不多看懂了&#xff0c;但是还有几个地方需要实验一下&#…

SpringBoot整合异步任务执行

同步任务&#xff1a; 同步任务是在单线程中按顺序执行&#xff0c;每次只有一个任务在执行&#xff0c;不会引发线程安全和数据一致性等 并发问题 同步任务需要等待任务执行完成后才能执行下一个任务&#xff0c;无法同时处理多个任务&#xff0c;响应慢&#xff0c;影响…

C++ 语言特性21 - 别名模板

一&#xff1a;概述 别名模板是 C11 引入的&#xff0c;用于为一个模板类型定义别名&#xff0c;从而简化复杂的模板类型定义。它结合了 using 关键字&#xff0c;可以对模板类型进行重新命名&#xff0c;使代码更加简洁和可读。 1. 作用 定义模板类型的别名。简化复杂的模板类…

VirtualBox+Vagrant快速搭建Centos7系统【最新详细教程】

VirtualBoxVagrant快速搭建Centos7系统 &#x1f4d6;1.安装VirtualBox✅下载VirtualBox✅安装 &#x1f4d6;2.安装Vagrant✅下载Vagrant✅安装 &#x1f4d6;3.搭建Centos7系✅初始化Vagrantfile文件生成✅启动Vagrantfile文件✅解决 vagrant up下载太慢的问题✅配置网络ip地…

Python--加载Hugging Face模型文件异常处理

尝试加载 Hugging Face 模型的配置文件时&#xff0c;无法从 https://huggingface.co 获取所需的 config.json 文件。这个错误通常是由于网络连接问题、访问受限或路径配置错误导致的。让我们一步步分析并解决这个问题。 可能原因及解决方案&#xff1a; 网络连接问题&#xf…

咸鱼sign逆向分析与爬虫实现

目标&#xff1a;&#x1f41f;的搜索商品接口 这个站异步有点多&#xff0c;好在代码没什么混淆。加密的sign值我们可以通过搜索找到位置 sign值通过k赋值&#xff0c;k则是字符串拼接后传入i函数加密 除了开头的aff…&#xff0c;后面的都是明文没什么好说的&#xff0c;我…

SysML案例-电磁轨道炮

DDD领域驱动设计批评文集>> 《软件方法》强化自测题集>> 《软件方法》各章合集>> 图片示例摘自intercax.com&#xff0c;作者是Intercax公司总裁Dirk Zwemer博士。

代码随想录:107、寻找存在的路径

107. 寻找存在的路径 这是道简单的并查集题目&#xff0c;设计插入&#xff0c;查找函数&#xff0c;比较基础 1、条件准备 father数组存每个结点的祖宗结点是谁 #include <bits/stdc.h>#define rep(i, l, r) for (int i l; i < r; i)using namespace std;#define…

Django学习笔记九:Django中间件Middleware

Django中间件&#xff08;Middleware&#xff09;是一段在Django的请求/响应处理过程中&#xff0c;可以介入并改变请求或响应的代码。中间件是Django框架中一个非常强大的功能&#xff0c;它允许你在Django的视图函数之前或之后执行自定义代码。 中间件可以用于&#xff1a; …

C题(六) 1到 100 的所有整数中出现多少个数字9

场景&#xff1a;编写程序数一下 1到 100 的所有整数中出现多少个数字9 控制循环的变量不可以随意改动&#xff01;&#xff01;&#xff01; 控制循环的变量不可以随意改动&#xff01;&#xff01;&#xff01; 控制循环的变量不可以随意改动&#xff01;&#xff01;&#x…

看480p、720p、1080p、2k、4k、视频一般需要多大带宽呢?

看视频都喜欢看高清&#xff0c;那么一般来说看电影不卡顿需要多大带宽呢&#xff1f; 以4K为例&#xff0c;这里引用一位网友的回答&#xff1a;“视频分辨率4092*2160&#xff0c;每个像素用红蓝绿三个256色(8bit)的数据表示&#xff0c;视频帧数为60fps&#xff0c;那么一秒…

数据结构--二叉树的顺序实现(堆实现)

引言 在计算机科学中&#xff0c;二叉树是一种重要的数据结构&#xff0c;广泛应用于各种算法和程序设计中。本文将探讨二叉树的顺序实现&#xff0c;特别是堆的实现方式。 一、树 1.1树的概念与结构 树是⼀种⾮线性的数据结构&#xff0c;它是由 n(n>0) 个有限结点组成…

C#串口温度读取

背景&#xff1a;每天学点&#xff0c;坚持 要安装好虚拟串口和modbus poll&#xff0c;方便调试&#xff08;相关资源在文末&#xff0c;也可以私信找我要&#xff09; 传感器部分使用的是达林科技的DL11B-MC-D1&#xff0c;当时42软妹币买的&#xff08;官网上面有这个传感…

若依--文件上传前端

前端 ry的前端文件上传单独写了一个FileUpload.Vue文件。在main.js中进行了全局的注册&#xff0c;可以在页面中直接使用文件上传的组件。全局导入 在main.js中 import 组件名称 from /components/FileUpLoadapp.compoent(组件名称) //全局挂载组件在项目中使用 组件命令 中…

SwipeRefreshLayout和ViewPager滑动冲突的原因和正确的解决方式

重写SwipeRefreshLayout的onIntercept方法就可以很简单的解决了。 思路&#xff1a; 因为下拉刷新&#xff0c;只有纵向滑动的时候才有效&#xff0c;那么我们就判断此时是纵向滑动还是横向滑动就可以了。纵向滑动就拦截事件&#xff0c;横向滑动不拦截。怎么判断是纵向滑动还…

vue ui指令打不开图形化界面解决方案

原因&#xff1a;由于我的node版本过高 和脚手架版本(3)不兼容 导致无法正常运行指令vue ui从而打开图形化界面管理vue项目 报错信息为TypeError: Function.prototype.apply was called on undefined, which is a undefined and not a function 解决措施&#xff1a;我们可以降…

828华为云征文|华为云 Flexus X 实例之家庭娱乐中心搭建

话接上文《828华为云征文&#xff5c;华为云Flexus X实例初体验》&#xff0c;这次我们利用手头的 Flexus X 实例来搭建家庭影音中心和密码管理环境。 前置环境 为了方便小白用户甚至运维人员&#xff0c;我觉得现阶段的宝塔面板 和 1Panel 都是不错的选择。我这里以宝塔为例…

GPTQ vs AWQ vs GGUF(GGML) 速览和 GGUF 文件命名规范

简单介绍一下四者的区别。 参考链接&#xff1a;GPTQ - 2210.17323 | AWQ - 2306.00978 | GGML | GGUF - docs | What is GGUF and GGML? 文章目录 GPTQ vs AWQ vs GGUF&#xff08;GGML&#xff09; 速览GGUF 文件命名GGUF 文件结构文件名解析答案 附录GGUF 文件命名GGUF 文件…

maven安装本地jar包到本地仓库

有时候我们需要把本地的 jar 包 install 到本地的 maven 仓库&#xff0c;这时就需要手动install依赖项。例如&#xff0c;把下面的 zhdx-license-1.0.jar 安装到本地 maven 仓库的操作如下&#xff1a; <dependency><groupId>com.zhdx</groupId><artifa…

CSS综合页布面局案例

写的比较一般,如果想要参考可以点击链接。 CSS综合案例(登录页面)资源-CSDN文库 引言: 我们学习CSS和HTML都是为了想要做一个网页布局,但是每逢上手可能就会需要查阅很多语言,我觉得是没有什么问题的,熟能生巧,编程是需要练的,但是写网页的时候需要实现某个效果时需…