• C++
  • C++ 高精度算法中低精度整数 a / b 保留几位小数

  • @ 2025-5-16 12:03:05

C++ 高精度算法中低精度整数 a / b 保留几位小数的教程

0基础通俗易懂,讲解多,使用 using namespace std;


📚 什么是“低精度 a / b 保留小数”?

我们这里说的“低精度”是指:

  • ab 是普通的整数类型(如 int
  • 结果要计算 a / b 的商,并保留 n 位小数
  • 不涉及高精度字符串处理,而是用 模拟竖式除法的方式手动实现

虽然 C++ 中可以直接用浮点数(如 double)来做除法,但它们的精度有限(最多约15~17位有效数字),不能满足某些场景下对更多位小数的需求。

所以我们今天就来学习:如何用 int 做除法,并手动模拟除法过程,保留指定的小数位数


🧠 基本思路:模拟竖式除法

我们要模拟的是小时候学过的除法过程:

       3.25
     _______
   4 )13
      -12
      ----
        10
       - 8
       ----
         20
        -20
        ----
          0

关键步骤如下:

  1. 先计算整数部分(就像普通整数除法)
  2. 如果还有余数,就在后面补一个 0,继续除下去
  3. 每次得到一位小数,直到达到要求的小数位数为止
  4. 最终把结果拼接起来输出

💡 数据结构选择:字符串 + 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,简单直观
模拟竖式除法 手动处理余数并补零,继续除下去
支持负数 通过异或判断符号
支持任意位小数 控制循环次数即可
输出为字符串 可以保留所有小数位,避免精度丢失

🧪 练习建议

你可以试着扩展以下功能:

  • 实现四舍五入(比如保留两位小数时自动进位)
  • 返回值改为 stringpair<string, int>(包含整数和小数部分)
  • 把结果写入文件保存
  • 判断是否出现循环小数(进阶)

🙋‍♂️ 如何继续学习?

如果你已经掌握低精度除法保留小数,可以挑战以下内容:

  • 学习如何处理大数(C风格字符串)的除法
  • 学习高精度加减乘除全套算法
  • 实现一个简单的计算器程序
  • 学习浮点数的表示原理(IEEE 754)

如果你希望我继续扩展以下内容,请告诉我:

  • 如何实现四舍五入?
  • 如何识别循环小数?
  • 如何把结果保存为文件?
  • 如何用类封装这个功能?

😊

0 条评论

目前还没有评论...