我是新来的,所以对我的知识不足深表歉意。
我正在尝试创建一个程序,该程序将允许用户输入数字(n)。用户输入此数字后,程序应将pi输出到小数点后n位,但不四舍五入。例如,如果用户输入“ 3”,我希望输出显示3.141,而不是3.142。
我设法编写了将代码输出到小数点后n位的代码,但是不足为奇的是,输出可能会将数字四舍五入,这可能是由于使用了setprecision函数。我的代码可以在这里看到:
UPDATE TABLE baking_events SET duration = [start_date, end_date]::daterange
如何更改此设置以防止程序舍入数字?代码的唯一问题是四舍五入问题。如何解决此问题?预先谢谢你。
答案 0 :(得分:2)
在采用operator<<
*)中的设置的实现中,可以使用std::fesetround()
:
#include <iostream>
#include <iomanip>
#include <cfenv>
int main()
{
constexpr auto pi{ 3.1415926535897932 };
std::fesetround(FE_DOWNWARD);
for(int n = 0; n < 16; ++n)
std::cout << "Your pi value is: " << std::fixed << std::setprecision(n) << pi << '\n';
}
Your pi value is: 3
Your pi value is: 3.1
Your pi value is: 3.14
Your pi value is: 3.141
Your pi value is: 3.1415
Your pi value is: 3.14159
Your pi value is: 3.141592
Your pi value is: 3.1415926
Your pi value is: 3.14159265
Your pi value is: 3.141592653
Your pi value is: 3.1415926535
Your pi value is: 3.14159265358
Your pi value is: 3.141592653589
Your pi value is: 3.1415926535897
Your pi value is: 3.14159265358979
Your pi value is: 3.141592653589793
*)Microsoft的标准库实现没有。
另一种简单的解决方案是使用std::stringstream
并打印所需的数字:
#include <iostream>
#include <iomanip>
#include <sstream>
int main()
{
constexpr auto pi{ 3.1415926535897932 };
std::stringstream ss;
ss << std::fixed << std::setprecision(16u) << pi;
for (int n = 1; n < 18; ++n) {
if (n != 2) // no point in printing "3" and "3." additionally.
std::cout << "Your pi value is: " << ss.str().substr(0, n) << '\n';
}
}
通过用户输入:
#include <cstdlib>
#include <limits>
#include <iostream>
#include <iomanip>
#include <sstream>
int main()
{
constexpr auto pi{ 3.1415926535897932 };
std::stringstream ss;
ss << std::fixed << std::setprecision(16) << pi;
unsigned digits;
while (std::cout << "How many digits of pi do you want? (up to 16) ",
!(std::cin >> digits) || digits > 16)
{
std::cerr << "Input Error :(\n\n";
std::cin.clear();
std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
}
std::cout << "Your pi value is: " << ss.str().substr(0, 2 + digits) << '\n';
}