第十二章--- fixed 和 setprecision 函数、round 函数、进制转换及底层逻辑
1. 保留几位小数
在C++中,如果你想要控制输出的小数点后的位数,可以使用<iomanip>
头文件提供的fixed
和setprecision
函数。这里的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;
}
代码解析
-
用户输入:
- 程序首先提示用户输入一个整数。
-
输出不同进制的表示:
- 使用
std::dec
,std::oct
,std::hex
分别输出十进制、八进制和十六进制的表示。 - 使用
std::bitset
输出二进制表示,这里输出32位以确保足够的位数。
- 使用
-
手动转换函数:
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++中如何控制小数位数以及如何进行四舍五入操作与进制相互转换的详细解释。希望这些信息对你有所帮助!
相关文章:
第十二章--- fixed 和 setprecision 函数、round 函数、进制转换及底层逻辑
1. 保留几位小数 在C中,如果你想要控制输出的小数点后的位数,可以使用<iomanip>头文件提供的fixed和setprecision函数。这里的fixed用于设置浮点数的输出格式为定点表示法,而setprecision(n)则用来指定小数点后保留的位数。具体用法如…...

ASP.NetCore---I18n(internationalization)多语言版本的应用
文章目录 0.实现的效果如下1.创建新项目I18nBaseDemo2.添加页面中的下拉框3.在HomeController中添加ChangeLanguage方法4.在Progress.cs 文件中添加如下代码:5. 在progress.cs中添加code6.添加Resource资源文件7.在页面中引用i18n的变量8. 重启项目,应该…...

vue3 环境配置vue-i8n国际化
一.依赖和插件的安装 主要是vue-i18n和 vscode的自动化插件i18n Ally https://vue-i18n.intlify.dev/ npm install vue-i18n10 pnpm add vue-i18n10 yarn add vue-i18n10 vscode在应用商城中搜索i18n Ally:如图 二.实操 安装完以后在对应项目中的跟package.jso…...

2024 uniapp入门教程 01:含有vue3基础 我的第一个uniapp页面
uni-app官网uni-app,uniCloud,serverless,快速体验,看视频,10分钟了解uni-app,为什么要选择uni-app?,功能框架图,一套代码,运行到多个平台https://uniapp.dcloud.net.cn/ 准备工作:HBuilder X 软件 HBuilder X 官网下载…...

CentOS 7文件系统
从centos7开始,默认的文件系统从ext4变成了XFS。随着虚拟化的应用越来越广泛,作为虚拟化磁盘来源的大文件(单个文件几GB级别)越来越常见。 1.XFS组成部分: XFS文件系统在数据的分布上主要划分为三部分:数据…...
vue源码解析(源码解析学习大纲)
文章目录 Vue源码解析入手方向大纲1.核心概念1-1.响应式系统1-2. 组件1-3. 虚拟DOM1-4. 指令1-5. 生命周期钩子 2.虚拟DOM2-1. 概念2-2. 工作流程2-3. 示例2-4.总结 3.组件系统3-1. 组件的定义3-2. 组件的创建3-3. 组件的模板3-4. 生命周期3-5. 事件处理3-6. 插槽(S…...

工行企业网银U盾展期后有两个证书问题的解决方法
工行企业网银U盾证书快到期后,可以自助展期,流程可以根据企业网银提示页面操作。操作后,可能存在两个新旧两个证书并存的情况,致使网银转账等操作失败,如图: 其原因是新证书生成后,旧证书没有删…...
《Linux从小白到高手》理论篇:文件权限控制及文件操作相关的命令
List item 本篇介绍Linux文件权限控制及文件操作相关的命令,看完本文,有关Linux文件权限控制及文件操作相关的常用命令你就掌握了99%了。 文件权限 在介绍文件权限之前先来复习下Linux的文件类型,始终记住那句话:Linux系统下&a…...
前端框架React的详细的学习方法和过程
学习React作为前端架构的一部分,是一个系统且逐步深入的过程。以下是一个详细的学习方法和过程,可以帮助你有效地掌握React: 1. 理解React的基础知识 首先,你需要了解React的基本概念,包括它是什么、为什么使用它以及…...

linux中缓存,在kafka上应用总结
linux中的缓存 页缓存 pagecatch(读缓存用于提供快速读)块缓存(用于提供其他设备快速写)当对读缓存读的时候,修改了读的数据,页缓存就会被标记为脏数据,等到写的时候它会向块缓存同步数据&…...

前端练习小项目 —— 让图片变得更 “色”
前言:相信读者在学习完了HTML、CSS和JavaScript之后已经想要迫不及待的想找一个小型的项目来练练手,那么这篇文章就正好能满足你的 “需求”。 ✨✨✨这里是秋刀鱼不做梦的BLOG ✨✨✨想要了解更多内容可以访问我的主页秋刀鱼不做梦-CSDN博客 在开始学习…...

时间卷积网络(TCN)原理+代码详解
目录 一、TCN原理1.1 因果卷积(Causal Convolution)1.2 扩张卷积(Dilated Convolution) 二、代码实现2.1 Chomp1d 模块2.2 TemporalBlock 模块2.3 TemporalConvNet 模块2.4 完整代码示例 参考文献 在理解 TCN 的原理之前ÿ…...
零散的知识
1.物化 在SQL中,物化(Materialization)是指将查询结果保存为物理数据结构以供后续使用的过程。这与普通的视图或查询不同,物化视图会存储查询的结果,而不是每次查询时都动态地重新计算数据。 ①物化视图 物化视图是一…...
Python读取pdf中的文字与表格
一、PyPDF2包安装 在Python中安装PyPDF2库,您可以使用pip包管理器。打开您的命令行工具(例如CMD、Terminal或Anaconda Prompt),然后输入以下命令: pip install PyPDF2 如果您使用的是Python 3,并且系统中…...

【MySQL 08】复合查询
目录 1.准备工作 2.多表查询 笛卡尔积 多表查询案例 3. 自连接 4.子查询 1.单行子查询 2.多行子查询 3.多列子查询 4.在from子句中使用子查询 5.合并查询 1.union 2.union all 1.准备工作 如下三个表,将作为示例,理解复合查询 EMP员工表…...

求1000以内的完数
题目:一个数如果恰好等于他的因子之和(包括1,但不包括这个数),这个数就是完数。编写算法找出1000之内的所有完数,并按下面格式输出其因子:28 its factors are 1,2,4,7,14 代码如下:…...

sqli-labs less-16 post提交dnslog注入
post提交DNSlog注入 第十六关和和十五关大差不大,可以使用布尔注入,时间盲注等,只不过闭合方式不一样,但是用布尔和时间盲太过于消耗时间,本次测试我将使用dnslog注入。 使用在线平台http://www.dnslog.cn/ 闭合方式…...
nginx报错|xquic|xqc_engine_create: fail|
一.问题描述 nginx使用xquic协议一切安装正常,nginx -s reload也正常,但就是访问不了网页 [emerg] 12342#0: |xquic|xqc_engine_create: fail| [emerg] 12342#0: |xquic|ngx_xquic_process_init|engine_init fail| [emerg] 12341#0: |xquic|xqc_engine_create: fai…...

Java虚拟机(JVM)
目录 内存区域划分堆(Heap)方法区(Method Area)程序计数器(Program Counter Register)虚拟机栈(VM Stack)本地方法栈(Native Method Stack) 类加载的过程类加…...

MQ 架构设计原理与消息中间件详解(三)
RabbitMQ实战解决方案 RabbitMQ死信队列 死信队列产生的背景 RabbitMQ死信队列俗称,备胎队列;消息中间件因为某种原因拒收该消息后,可以转移到死信队列中存放,死信队列也可以有交换机和路由key等。 产生死信队列的原因 消息投…...

接口测试中缓存处理策略
在接口测试中,缓存处理策略是一个关键环节,直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性,避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明: 一、缓存处理的核…...

Chapter03-Authentication vulnerabilities
文章目录 1. 身份验证简介1.1 What is authentication1.2 difference between authentication and authorization1.3 身份验证机制失效的原因1.4 身份验证机制失效的影响 2. 基于登录功能的漏洞2.1 密码爆破2.2 用户名枚举2.3 有缺陷的暴力破解防护2.3.1 如果用户登录尝试失败次…...
在软件开发中正确使用MySQL日期时间类型的深度解析
在日常软件开发场景中,时间信息的存储是底层且核心的需求。从金融交易的精确记账时间、用户操作的行为日志,到供应链系统的物流节点时间戳,时间数据的准确性直接决定业务逻辑的可靠性。MySQL作为主流关系型数据库,其日期时间类型的…...
Java如何权衡是使用无序的数组还是有序的数组
在 Java 中,选择有序数组还是无序数组取决于具体场景的性能需求与操作特点。以下是关键权衡因素及决策指南: ⚖️ 核心权衡维度 维度有序数组无序数组查询性能二分查找 O(log n) ✅线性扫描 O(n) ❌插入/删除需移位维护顺序 O(n) ❌直接操作尾部 O(1) ✅内存开销与无序数组相…...

Mybatis逆向工程,动态创建实体类、条件扩展类、Mapper接口、Mapper.xml映射文件
今天呢,博主的学习进度也是步入了Java Mybatis 框架,目前正在逐步杨帆旗航。 那么接下来就给大家出一期有关 Mybatis 逆向工程的教学,希望能对大家有所帮助,也特别欢迎大家指点不足之处,小生很乐意接受正确的建议&…...

DAY 47
三、通道注意力 3.1 通道注意力的定义 # 新增:通道注意力模块(SE模块) class ChannelAttention(nn.Module):"""通道注意力模块(Squeeze-and-Excitation)"""def __init__(self, in_channels, reduction_rat…...
Java 加密常用的各种算法及其选择
在数字化时代,数据安全至关重要,Java 作为广泛应用的编程语言,提供了丰富的加密算法来保障数据的保密性、完整性和真实性。了解这些常用加密算法及其适用场景,有助于开发者在不同的业务需求中做出正确的选择。 一、对称加密算法…...

iview框架主题色的应用
1.下载 less要使用3.0.0以下的版本 npm install less2.7.3 npm install less-loader4.0.52./src/config/theme.js文件 module.exports {yellow: {theme-color: #FDCE04},blue: {theme-color: #547CE7} }在sass中使用theme配置的颜色主题,无需引入,直接可…...
省略号和可变参数模板
本文主要介绍如何展开可变参数的参数包 1.C语言的va_list展开可变参数 #include <iostream> #include <cstdarg>void printNumbers(int count, ...) {// 声明va_list类型的变量va_list args;// 使用va_start将可变参数写入变量argsva_start(args, count);for (in…...
适应性Java用于现代 API:REST、GraphQL 和事件驱动
在快速发展的软件开发领域,REST、GraphQL 和事件驱动架构等新的 API 标准对于构建可扩展、高效的系统至关重要。Java 在现代 API 方面以其在企业应用中的稳定性而闻名,不断适应这些现代范式的需求。随着不断发展的生态系统,Java 在现代 API 方…...