如何在c ++中以用户给出的精度打印数字

时间:2016-09-27 21:37:29

标签: c++

如何以用户给出的精度打印数字。以及如何在小数点后打印精度达到100位。

假设A,B,C为三个数字并取用户的三个数字的值,我必须将A / B(A除以B)的答案打印到C个浮点。

如果A = 22,B = 7,C = 25,这意味着我必须将22/7的结果打印到25个浮点。

3.1428571428571428571428571,这是小数点后22/7,25位数的答案。

3 个答案:

答案 0 :(得分:2)

许多人指出,请使用std::fixedstd::setprecision

#include <iostream>
#include <iomanip>
int main()
{
    float x = 22.0/7.0;

    std::cout << std::fixed << std::setprecision(25) << x;
    return 0;
}

但是当你运行它时,你会看到输出是 它应该是3.1428570747375488281250000 3.1428571428571428571428571。是什么给了什么?

嗯,float s只能忍受这么多,然后不得不放弃并说:“我能做的最好,交配。”有传言说,这一点大概是7位数。根据看起来正确的快速计数。

那么我们试着double。它们的尺寸是它的两倍!

#include <iostream>
#include <iomanip>
int main()
{
    double x = 22.0/7.0;

    std::cout << std::fixed << std::setprecision(25) << x;
    return 0;
}

给了我们 3.1428571428571427937015414。还没有 3.1428571428571428571428571,但更接近。我们得到了什么比double大?刚试过long double。我的电脑上没有骰子。看起来我们将不得不去寻找一个好的高精度浮点库。

无赖。好吧,我有一天会one in Boost.看到boost::kitchen_sink

答案 1 :(得分:1)

要打印精度为“n”的浮点数,您应该写:

printf("%.nf"); // like printf("%.3f")

你有一个c ++完整代码

    #include <stdio.h>
    #include <stdlib.h>
    #include <strstream>
    #include <iostream>
    int main()
    {
        // print a float with precision '4'
        printf("%.4f",10.125f);
        // print a float with precision 'n'
        char * buffer = new char[100];
        int n;
        std::strstream ss; // like cout but outputs to a string buffer
        ss<<"%.";
        std::cout<<"Enter precision : ";
        std::cin>>n;
        ss<<n<<"f";
        printf(ss.str(),10,125); // ss.str() to get buffer content
        delete[] buffer;
     return 0;   
    }

但很简单,你仍然可以写

      std::cout << std::setprecision(n) << float_var;

编辑: 你可以做你自己的师!我的意思是你可以模拟处理器的分配并获得你想要的任何精度,直到无限!在那里,你是我为朋友写的一段有趣的代码:

#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include <chrono>
int main()
{
std::cout.sync_with_stdio(false); // accelerate output
register int x,y;
char opp;
std::cout<<"Enter x/y : ";
std::cin>>x>>opp>>y;
std::cout<<"deviding "<<x<<" by "<<y<<std::endl;
register int precision;
std::cout<<"Enter precision  : ";
std::cin>>precision;
register int precision_counter = 0;

  typedef std::chrono::high_resolution_clock Time;
typedef std::chrono::nanoseconds ms;
typedef std::chrono::duration<float> fsec;
auto t0 = Time::now();

std::cout <<"Result = ";
std::cout<<x/y;
// check if there will be a float point result to print a point
if(x<y || x%y != 0)
 {
       std::cout<<".";
x%=y; // remove what we printed
register int counter = 0;
// print digts that are after the float point
while (precision_counter<precision )
{
     x*=10;
     while (x>=y)
     {
           x-= y;
           counter++;
     }
     std::cout<<counter;
     counter = 0;
     precision_counter++;
}

/*
optimized loop :

 while (precision_counter<precision )
{
     x*=10;
     std::cout<<x/y;
     x%=y;
     precision_counter++;
}
  **/
 }

auto t1 = Time::now();
fsec fs = t1 - t0;
std::cout<<"\n";
ms d = std::chrono::duration_cast<ms>(fs);
std::cout << fs.count() << "s\n";
std::cout << d.count() << " nanosecond\n";
 std::cout<<std::endl;
 system("pause");
return 0;
}

答案 2 :(得分:1)

#include <iostream>
#include <string>
#include <sstream>

std::string f(int A, int B, int C){//A: numerator, B:denominator, C:digits after decimal point
    std::stringstream ss;
    int count = 0;

    if(A < 0){
        A = -A;
        ++count;
    }
    if(B < 0){
        B = -B;
        ++count;
    }
    if(count == 1)
        ss << '-';
    ss << A / B << '.';
    A %= B;
    A *= 10;
    count = C;
    while(count--){
        ss << A / B;
        A %= B;
        A *= 10;
    }

    return ss.str();
}

int main(void){
    std::cout << f(22, 7, 25) << std::endl;
    return 0;
}