如何以用户给出的精度打印数字。以及如何在小数点后打印精度达到100位。
假设A,B,C为三个数字并取用户的三个数字的值,我必须将A / B(A除以B)的答案打印到C个浮点。
如果A = 22,B = 7,C = 25,这意味着我必须将22/7的结果打印到25个浮点。
3.1428571428571428571428571,这是小数点后22/7,25位数的答案。
答案 0 :(得分:2)
许多人指出,请使用std::fixed
和std::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;
}