第十二章--- 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等。 产生死信队列的原因 消息投…...
[2025CVPR]DeepVideo-R1:基于难度感知回归GRPO的视频强化微调框架详解
突破视频大语言模型推理瓶颈,在多个视频基准上实现SOTA性能 一、核心问题与创新亮点 1.1 GRPO在视频任务中的两大挑战 安全措施依赖问题 GRPO使用min和clip函数限制策略更新幅度,导致: 梯度抑制:当新旧策略差异过大时梯度消失收敛困难:策略无法充分优化# 传统GRPO的梯…...
【算法训练营Day07】字符串part1
文章目录 反转字符串反转字符串II替换数字 反转字符串 题目链接:344. 反转字符串 双指针法,两个指针的元素直接调转即可 class Solution {public void reverseString(char[] s) {int head 0;int end s.length - 1;while(head < end) {char temp …...

C# 类和继承(抽象类)
抽象类 抽象类是指设计为被继承的类。抽象类只能被用作其他类的基类。 不能创建抽象类的实例。抽象类使用abstract修饰符声明。 抽象类可以包含抽象成员或普通的非抽象成员。抽象类的成员可以是抽象成员和普通带 实现的成员的任意组合。抽象类自己可以派生自另一个抽象类。例…...
WEB3全栈开发——面试专业技能点P2智能合约开发(Solidity)
一、Solidity合约开发 下面是 Solidity 合约开发 的概念、代码示例及讲解,适合用作学习或写简历项目背景说明。 🧠 一、概念简介:Solidity 合约开发 Solidity 是一种专门为 以太坊(Ethereum)平台编写智能合约的高级编…...

UR 协作机器人「三剑客」:精密轻量担当(UR7e)、全能协作主力(UR12e)、重型任务专家(UR15)
UR协作机器人正以其卓越性能在现代制造业自动化中扮演重要角色。UR7e、UR12e和UR15通过创新技术和精准设计满足了不同行业的多样化需求。其中,UR15以其速度、精度及人工智能准备能力成为自动化领域的重要突破。UR7e和UR12e则在负载规格和市场定位上不断优化…...

JVM虚拟机:内存结构、垃圾回收、性能优化
1、JVM虚拟机的简介 Java 虚拟机(Java Virtual Machine 简称:JVM)是运行所有 Java 程序的抽象计算机,是 Java 语言的运行环境,实现了 Java 程序的跨平台特性。JVM 屏蔽了与具体操作系统平台相关的信息,使得 Java 程序只需生成在 JVM 上运行的目标代码(字节码),就可以…...

【电力电子】基于STM32F103C8T6单片机双极性SPWM逆变(硬件篇)
本项目是基于 STM32F103C8T6 微控制器的 SPWM(正弦脉宽调制)电源模块,能够生成可调频率和幅值的正弦波交流电源输出。该项目适用于逆变器、UPS电源、变频器等应用场景。 供电电源 输入电压采集 上图为本设计的电源电路,图中 D1 为二极管, 其目的是防止正负极电源反接, …...

【C++进阶篇】智能指针
C内存管理终极指南:智能指针从入门到源码剖析 一. 智能指针1.1 auto_ptr1.2 unique_ptr1.3 shared_ptr1.4 make_shared 二. 原理三. shared_ptr循环引用问题三. 线程安全问题四. 内存泄漏4.1 什么是内存泄漏4.2 危害4.3 避免内存泄漏 五. 最后 一. 智能指针 智能指…...
「全栈技术解析」推客小程序系统开发:从架构设计到裂变增长的完整解决方案
在移动互联网营销竞争白热化的当下,推客小程序系统凭借其裂变传播、精准营销等特性,成为企业抢占市场的利器。本文将深度解析推客小程序系统开发的核心技术与实现路径,助力开发者打造具有市场竞争力的营销工具。 一、系统核心功能架构&…...

【Veristand】Veristand环境安装教程-Linux RT / Windows
首先声明,此教程是针对Simulink编译模型并导入Veristand中编写的,同时需要注意的是老用户编译可能用的是Veristand Model Framework,那个是历史版本,且NI不会再维护,新版本编译支持为VeriStand Model Generation Suppo…...