保留小数的4种方法
1. 使用的是 C++ 标准库中的 I/O 流操纵符方法来保留小数位数
在 C++ 中,你可以使用 std::fixed
和 std::setprecision
这两个操纵符来控制浮点数输出时的小数位数。以下是如何使用它们的示例:
#include <iostream>
#include <iomanip> // 包含这两个操纵符的头文件
int main() {
double num = 3.14159265358979323846;
// 设置输出为固定小数点格式,并保留两位小数
std::cout << std::fixed << std::setprecision(2) << num << std::endl;
return 0;
}
在这个例子中,std::fixed
告诉 cout
以固定小数点格式输出浮点数,而 std::setprecision(2)
设置了小数点后保留两位小数。输出结果将是 3.14
。
请注意,std::setprecision
设置的是包括小数点在内的总位数,如果数值的整数部分超过了这个数,它仍然会完整地输出整数部分,小数部分则根据设置的精度进行四舍五入。
如果你想要保留六位小数,可以这样设置:
std::cout << std::fixed << std::setprecision(6) << num << std::endl;
这将输出 3.141593
。
如果你想要在不使用 std::fixed
的情况下保留小数位数,也可以直接使用 std::setprecision
,但这样输出的小数位数将包括整数部分和小数部分,例如:
std::cout << std::setprecision(6) << num << std::endl;
这可能会输出 3.141593
,但如果你将 num
的值改为一个整数,比如 3
,那么输出将是 3.000000
,因为 std::setprecision(6)
设置的是总位数,而不是小数位数。所以,如果你想要确保小数点后总是有特定位数的数字,应该使用 std::fixed
。
2. 使用数学函数进行四舍五入
你可以使用数学函数来手动实现四舍五入到特定的小数位数。例如,使用 std::round
函数:
#include <iostream>
#include <cmath> // 包含数学函数的头文件
double roundToDecimalPlaces(double number, int decimalPlaces) {
double scale = std::pow(10.0, decimalPlaces);
return std::round(number * scale) / scale;
}
int main() {
double num = 3.14159265358979323846;
int decimalPlaces = 2;
std::cout << roundToDecimalPlaces(num, decimalPlaces) << std::endl; // 输出: 3.14
return 0;
}
3. 使用字符串流进行格式化
你可以使用 std::stringstream
来格式化数字,然后转换回 double
:
#include <iostream>
#include <sstream>
#include <iomanip>
double stringToDoubleWithPrecision(const std::string& str, int precision) {
std::stringstream ss;
ss << std::fixed << std::setprecision(precision) << str;
double result;
ss >> result;
return result;
}
int main() {
std::string numStr = "3.14159265358979323846";
int precision = 2;
std::cout << stringToDoubleWithPrecision(numStr, precision) << std::endl; // 输出: 3.14
return 0;
}
4. 自定义函数进行截断
如果你只需要截断小数而不是四舍五入,可以自定义一个函数来实现:
#include <iostream>
double truncateToDecimalPlaces(double number, int decimalPlaces) {
double scale = std::pow(10.0, decimalPlaces);
return std::trunc(number * scale) / scale;
}
int main() {
double num = 3.14159265358979323846;
int decimalPlaces = 2;
std::cout << truncateToDecimalPlaces(num, decimalPlaces) << std::endl; // 输出: 3.14
return 0;
}
这些方法提供了除了 std::fixed
和 std::setprecision
之外的其他选择,可以根据你的具体需求选择使用。