如何使输入问题输入2.785时,输出将变量问题显示为2.79?
我试着使用setprecision,但由于某种原因,它不起作用,除非我做错了
这是用户输入的问题,它应该是什么:
Enter positive daily growth % (.1 must be entered as 10):
user enters "2.785"
output -> 0.02785
我想要的输出应该是:
desired output-> 2.79%
感谢您的帮助。我知道这对其他人来说可能很简单,但我已经试过在网上查找了,我发现的一切都没有意义或不起作用,我不知道自己做错了什么。
浮点运算
之所以具有挑战性,是因为当您对浮点执行操作时,浮点无法准确表示。参见维基百科文章
这是一个非常有趣的话题,如果你有一点时间,看看关于浮点的解释以及它在计算机中的表示方式。
如果只查找显示(仅适用于小小数)
如果你只是想显示一个小值,你可以使用以下代码:
#include <cmath>
#include <iostream>
#include <iomanip>
#include <limits>
#include <sstream>
using namespace std;
string truncateAsString(double n, int precision) {
stringstream ss;
double remainder = static_cast<double>((int)floor((n - floor(n)) * precision) % precision);
ss << setprecision(numeric_limits<double> ::max_digits10 + __builtin_ctz(precision))<< floor(n);
if (remainder)
ss << "." << remainder;
cout << ss.str() << "%" << endl;
return ss.str();
}
int main(void) {
double a = 0.02785;
int precision = 100; // as many digits as you add zeroes. 3 zeroes means precision of 3.
string s = truncateAsString(a*100 + 0.5 / 100, precision);
return 0;
}
寻找真实值
也许你正在为你的浮点寻找真正的价值,你可以使用boost多精度库
Boost.Multiprecision库可用于精度超过标准内置类型(如浮点、双精度和长双精度)的计算。对于扩展精度计算,Boost.Multiprecision提供了一个名为cpp_dec_foat的模板数据类型。精度的小数位数在编译时通过模板参数固定。
由于浮点精度不足,您需要使用像boost/multiprecision这样的自定义库,请参阅下面的代码:
#include <boost/math/constants/constants.hpp>
#include <boost/multiprecision/cpp_dec_float.hpp>
#include <iostream>
#include <limits>
#include <cmath>
#include <iomanip>
using namespace std;
using boost::multiprecision::cpp_dec_float_50;
cpp_dec_float_50 truncate(cpp_dec_float_50 n, int precision) {
cpp_dec_float_50 remainder = static_cast<cpp_dec_float_50>((int)floor((n - floor(n)) * precision) % precision) / static_cast<cpp_dec_float_50>(precision);
return floor(n) + remainder;
}
int main(void) {
int precision = 100; // as many digits as you add zeroes. 5 zeroes means precision of 5.
cpp_dec_float_50 n = 0.02785 * 100;
n = truncate(n + 0.5/precision, precision); // first part is remainder, floor(n) is int value truncated.
cout << setprecision(numeric_limits<cpp_dec_float_50> ::max_digits10 + __builtin_ctz(precision)) << n << "%" << endl; // __builtin_ctz(precision) will equal the number of trailing 0, exactly the precision we need!
return 0;
}
输出(两种情况)
2.79%
注意:我将0.5 / precision
添加到truncate函数中,以强制它执行舍入操作