嘿,所以我正在创建一个返回小数,整数或总数的函数,但是无法使其与以下任何一种方式一起工作:
乘以一个非常大的数字就像100亿不能正常工作,因为计算机存储小数的真空方式,制作2.3 2.2999575697
使用 StringStream 将数字转换为字符串并对字符进行计数不起作用,因为它要求您将流设置为精度,该精度要么带走要么添加不必要的'如果未设置为实际小数位数,则为0'字符
那我现在该做什么?有人请帮忙=(谢谢!
如果你想看到我的函数将麻木转换为字符串,那么它就是:
////////////////////// Numbs_Digits ////////////////////////////////////////////////
template<typename T>
int Numbs_Digits(T numb, int scope)
{
stringstream ss(stringstream::in| stringstream::out), ss2(stringstream::in| stringstream::out);
unsigned long int length= 0;
unsigned long int numb_wholes;
ss2 << (int)numb;
numb_wholes = ss2.str().length(); ss2.flush();
bool all= false;
ss.precision(11); // HOW DO I MAKE THE PRECISION NUMBER THE NUMBER OF DECIMALS?
switch(scope){
case ALL: all = true;
case DECIMALS: ss << fixed << numb;
length += ss.str().length()- (numb_wholes +1); // +1 for the "."
if(all!= true) break;
case WHOLE_NUMBS:
length += numb_wholes;
if(all!= true) break;
default: break;}
return length;};
答案 0 :(得分:3)
如果您想知道long double
可以存储的最大小数位数,则此值可在LDBL_DIG
中定义的常量cfloat
中使用。请注意,这个数字实际上是一个近似值,因为值在内部以二进制形式存储,因此值的范围不是10的幂。
答案 1 :(得分:2)
只有一些十进制数可以精确的形式存储为浮点数。因此,无法确定对于任何十进制数都不重要的小数位数。正如hammar建议的那样,阅读浮点存储格式,我相信每个程序员都应该对这些低级别的东西有一些了解:D
乘以一个非常大的数字,如100亿不起作用,因为计算机存储小数的真空方式,制作2.3 2.2999575697
这正是问题所在。你能看看2.999575697并告诉我它有两个小数位吗?此数字是使用浮点格式无法以精确格式存储的十进制数的示例。你能做的最好的事情是计算存储在浮点数中的有效小数位数,它最接近它给出的原始十进制数 - 这是我无法想象会有多大用处。
编辑以获得更准确的解释。
答案 2 :(得分:0)
您是否可以在ios_base
中将cfloat.h
精度设置为平台上有效数字中的最大小数位数,然后使用ios_base::setf()
将浮点格式更改为科学,它将从浮点数中删除任何尾随零(你只需要调整末尾的指数)?