将pi输出到小数点后n位而不舍入(用户输入)

时间:2018-11-06 23:48:18

标签: c++

我是新来的,所以对我的知识不足深表歉意。

我正在尝试创建一个程序,该程序将允许用户输入数字(n)。用户输入此数字后,程序应将pi输出到小数点后n位,但不四舍五入。例如,如果用户输入“ 3”,我希望输出显示3.141,而不是3.142。

我设法编写了将代码输出到小数点后n位的代码,但是不足为奇的是,输出可能会将数字四舍五入,这可能是由于使用了setprecision函数。我的代码可以在这里看到:

UPDATE TABLE baking_events SET duration = [start_date, end_date]::daterange

如何更改此设置以防止程序舍入数字?代码的唯一问题是四舍五入问题。如何解决此问题?预先谢谢你。

1 个答案:

答案 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';
}