保留小数的4种方法

1. 使用的是 C++ 标准库中的 I/O 流操纵符方法来保留小数位数

在 C++ 中,你可以使用 std::fixedstd::setprecision 这两个操纵符来控制浮点数输出时的小数位数。以下是如何使用它们的示例:

  1. #include <iostream>
  2. #include <iomanip> // 包含这两个操纵符的头文件
  3. int main() {
  4. double num = 3.14159265358979323846;
  5. // 设置输出为固定小数点格式,并保留两位小数
  6. std::cout << std::fixed << std::setprecision(2) << num << std::endl;
  7. return 0;
  8. }

在这个例子中,std::fixed 告诉 cout 以固定小数点格式输出浮点数,而 std::setprecision(2) 设置了小数点后保留两位小数。输出结果将是 3.14

请注意,std::setprecision 设置的是包括小数点在内的总位数,如果数值的整数部分超过了这个数,它仍然会完整地输出整数部分,小数部分则根据设置的精度进行四舍五入。

如果你想要保留六位小数,可以这样设置:

  1. std::cout << std::fixed << std::setprecision(6) << num << std::endl;

这将输出 3.141593

如果你想要在不使用 std::fixed 的情况下保留小数位数,也可以直接使用 std::setprecision,但这样输出的小数位数将包括整数部分和小数部分,例如:

  1. std::cout << std::setprecision(6) << num << std::endl;

这可能会输出 3.141593,但如果你将 num 的值改为一个整数,比如 3,那么输出将是 3.000000,因为 std::setprecision(6) 设置的是总位数,而不是小数位数。所以,如果你想要确保小数点后总是有特定位数的数字,应该使用 std::fixed


2. 使用数学函数进行四舍五入

你可以使用数学函数来手动实现四舍五入到特定的小数位数。例如,使用 std::round 函数:

  1. #include <iostream>
  2. #include <cmath> // 包含数学函数的头文件
  3. double roundToDecimalPlaces(double number, int decimalPlaces) {
  4. double scale = std::pow(10.0, decimalPlaces);
  5. return std::round(number * scale) / scale;
  6. }
  7. int main() {
  8. double num = 3.14159265358979323846;
  9. int decimalPlaces = 2;
  10. std::cout << roundToDecimalPlaces(num, decimalPlaces) << std::endl; // 输出: 3.14
  11. return 0;
  12. }

3. 使用字符串流进行格式化

你可以使用 std::stringstream 来格式化数字,然后转换回 double

  1. #include <iostream>
  2. #include <sstream>
  3. #include <iomanip>
  4. double stringToDoubleWithPrecision(const std::string& str, int precision) {
  5. std::stringstream ss;
  6. ss << std::fixed << std::setprecision(precision) << str;
  7. double result;
  8. ss >> result;
  9. return result;
  10. }
  11. int main() {
  12. std::string numStr = "3.14159265358979323846";
  13. int precision = 2;
  14. std::cout << stringToDoubleWithPrecision(numStr, precision) << std::endl; // 输出: 3.14
  15. return 0;
  16. }

4. 自定义函数进行截断

如果你只需要截断小数而不是四舍五入,可以自定义一个函数来实现:

  1. #include <iostream>
  2. double truncateToDecimalPlaces(double number, int decimalPlaces) {
  3. double scale = std::pow(10.0, decimalPlaces);
  4. return std::trunc(number * scale) / scale;
  5. }
  6. int main() {
  7. double num = 3.14159265358979323846;
  8. int decimalPlaces = 2;
  9. std::cout << truncateToDecimalPlaces(num, decimalPlaces) << std::endl; // 输出: 3.14
  10. return 0;
  11. }

这些方法提供了除了 std::fixedstd::setprecision 之外的其他选择,可以根据你的具体需求选择使用。