如何计算大双数中有多少位小数?

时间:2011-05-16 01:15:23

标签: c++ double precision

嘿,所以我正在创建一个返回小数,整数或总数的函数,但是无法使其与以下任何一种方式一起工作:

  • 乘以一个非常大的数字就像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;};

3 个答案:

答案 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()将浮点格式更改为科学,它将从浮点数中删除任何尾随零(你只需要调整末尾的指数)?