- C++
C++ 高精度算法中低精度整数 a / b 保留几位小数
- 2025-5-16 12:03:05 @
C++ 高精度算法中低精度整数 a / b
保留几位小数的教程
0基础通俗易懂,讲解多,使用 using namespace std;
📚 什么是“低精度 a / b 保留小数”?
我们这里说的“低精度”是指:
a
和b
是普通的整数类型(如int
)- 结果要计算
a / b
的商,并保留 n 位小数 - 不涉及高精度字符串处理,而是用 模拟竖式除法的方式手动实现
虽然 C++ 中可以直接用浮点数(如 double
)来做除法,但它们的精度有限(最多约15~17位有效数字),不能满足某些场景下对更多位小数的需求。
所以我们今天就来学习:如何用 int 做除法,并手动模拟除法过程,保留指定的小数位数。
🧠 基本思路:模拟竖式除法
我们要模拟的是小时候学过的除法过程:
3.25
_______
4 )13
-12
----
10
- 8
----
20
-20
----
0
关键步骤如下:
- 先计算整数部分(就像普通整数除法)
- 如果还有余数,就在后面补一个
0
,继续除下去 - 每次得到一位小数,直到达到要求的小数位数为止
- 最终把结果拼接起来输出
💡 数据结构选择:字符串 + vector
我们使用字符串保存最终的结果(包括整数和小数部分),这样可以灵活控制输出格式。
💻 示例代码(完整可运行)
#include <iostream>
#include <string>
using namespace std;
// 计算 a / b,保留 decimalPlaces 位小数
string divideWithDecimal(int a, int b, int decimalPlaces) {
if (b == 0) {
return "错误:除数不能为0!";
}
// 处理负号
bool isNegative = (a < 0) ^ (b < 0);
a = abs(a);
b = abs(b);
string result;
// 整数部分
result += to_string(a / b);
int remainder = a % b;
// 如果没有余数,直接返回
if (remainder == 0) {
if (isNegative && result != "0")
result = "-" + result;
return result;
}
// 小数点
result += ".";
// 小数部分
for (int i = 0; i < decimalPlaces; ++i) {
remainder *= 10;
int digit = remainder / b;
result += to_string(digit);
remainder %= b;
}
// 加上负号
if (isNegative)
result = "-" + result;
return result;
}
int main() {
int a, b;
int decimalPlaces;
cout << "请输入被除数 a(int 类型):";
cin >> a;
cout << "请输入除数 b(int 类型):";
cin >> b;
cout << "请输入要保留的小数位数:";
cin >> decimalPlaces;
string result = divideWithDecimal(a, b, decimalPlaces);
cout << "结果是:" << result << endl;
return 0;
}
📖 示例运行
输入:
请输入被除数 a(int 类型):10
请输入除数 b(int 类型):3
请输入要保留的小数位数:20
输出:
结果是:3.33333333333333333333
再试一个带负号的例子:
输入:
请输入被除数 a(int 类型):-1
请输入除数 b(int 类型):7
请输入要保留的小数位数:50
输出:
结果是:-0.1428571428571428571428571428571428571428571428571429
✅ 总结知识点
内容 | 说明 |
---|---|
使用 int 类型 |
不需要字符串或 vector,简单直观 |
模拟竖式除法 | 手动处理余数并补零,继续除下去 |
支持负数 | 通过异或判断符号 |
支持任意位小数 | 控制循环次数即可 |
输出为字符串 | 可以保留所有小数位,避免精度丢失 |
🧪 练习建议
你可以试着扩展以下功能:
- 实现四舍五入(比如保留两位小数时自动进位)
- 返回值改为
string
或pair<string, int>
(包含整数和小数部分) - 把结果写入文件保存
- 判断是否出现循环小数(进阶)
🙋♂️ 如何继续学习?
如果你已经掌握低精度除法保留小数,可以挑战以下内容:
- 学习如何处理大数(C风格字符串)的除法
- 学习高精度加减乘除全套算法
- 实现一个简单的计算器程序
- 学习浮点数的表示原理(IEEE 754)
如果你希望我继续扩展以下内容,请告诉我:
- 如何实现四舍五入?
- 如何识别循环小数?
- 如何把结果保存为文件?
- 如何用类封装这个功能?
😊
0 条评论
目前还没有评论...