当前位置: 首页 > article >正文

第十二章--- 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"; // 输出15
    return 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,四舍五入后再除以100
    std::cout << a << "\n"; // 输出14.35
    return 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.kler.cn/news/331140.html

相关文章:

  • 【Unity单机游戏框架】K-Framework
  • Unity实战案例全解析:RTS游戏的框选和阵型功能(2) 生成选择框
  • Servlet的生命周期及用户提交表单页面的实现(实验报告)
  • ENV | WSL 拓展虚拟磁盘空间
  • 【mod分享】极品飞车12无间风云高清重置mod,车模重构和材质贴图高清化
  • 【C++篇】领略模板编程的进阶之美:参数巧思与编译的智慧
  • Element UI教程:如何将Radio单选框的圆框改为方框
  • 通信工程学习:什么是DNS域名系统
  • 做数据抓取工作要如何选择ip池
  • Windows 11 24H2正式发布
  • Linux如何查看每个文件及文件夹的大小
  • C语言复习概要(一)
  • 链表面试编程题
  • 在中序线索树中找到数据域A,并在其左子树中插入数据域为x的结点
  • Java JUC(三) AQS与同步工具详解
  • 机器学习【教育领域及其平台搭建】
  • 用好AI告别灵感枯竭!如何用300个选题提示词打造病毒式内容?
  • Python笔记 - 函数、方法和类装饰器
  • react-问卷星项目(4)
  • Django一分钟:DRF模型序列化器处理关联关系的示例与注意事项