C++十进制位置



如何使输入问题输入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函数中,以强制它执行舍入操作

最新更新