【问题标题】:How to figure out how many decimal digits are in a large double?如何计算大双精度数中有多少个十进制数字?
【发布时间】:2011-05-16 01:15:23
【问题描述】:

嘿,所以我正在制作一个函数,它返回小数位数、整数或总数,但无法使用以下任何一种方式使其工作:

  • 乘以一个非常大的数字(例如 100 亿)不起作用,因为计算机存储小数的方式不准确,因此 2.3 2.2999575697

  • '如果未设置为实际小数位数,则为 0' 个字符

那么我现在该怎么办?有人请帮忙 =( 谢谢!

如果你想看看我的将 numb 转换为字符串的函数,那就是:

//////////////////////      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;};

【问题讨论】:

  • 与其给我们你的示例代码,如果你能更清楚地描述问题可能会更好。请给出一些数字示例和您期望的结果。
  • 从您之前的问题来看,我建议您阅读浮点的实际工作原理。然后你就会明白为什么“双精度数中的小数位数”没有多大意义。

标签: c++ double precision


【解决方案1】:

如果您想知道long double 可以存储的最大十进制位数,可以在cfloat 中定义的常量LDBL_DIG 中获得此值。请注意,这个数字实际上是一个近似值,因为值在内部以二进制形式存储,因此值的范围不是 10 的幂。

【讨论】:

    【解决方案2】:

    只有一些十进制数可以精确地存储为浮点数。因此,无法确定任何不正确的十进制数有多少小数位是有效的。正如 hammar 建议的那样,阅读浮点存储格式,我相信每个程序员都应该对这样的低级内容有所了解:D

    由于计算机存储小数的方式不准确,因此乘以 100 亿这样一个非常大的数字是行不通的,因此 2.3 2.2999575697

    这正是问题所在。你能看看 2.999575697 并告诉我它有两位小数吗?这个数字是一个十进制数的例子,不能使用浮点格式以精确的形式存储。你能做的最好的就是计算存储在浮点数中的有效小数位,它最接近给出的原始十进制数 - 我无法想象会有多大用处。

    已编辑以获得更准确的解释。

    【讨论】:

    • 二进制浮点数精确表示,只是有些分数可以用有限小数表示,但不能用有限二进制表示。
    • 双精度数包含 52 个有效二进制数字或 15.95 个有效十进制数字 (53 log 2)。但是,为了区分相邻的双精度值,最多需要 17 个十进制数字。
    • @phoog 我应该使用以下措辞:浮点数不能精确表示某些十进制数。这是一个在任何解决该问题的方法中都会经常出现的问题,尝试这样做不会有太多收获。
    • @Synex:除非您编辑答案,否则 Stack Overflow 不允许我删除我的反对票。如果你这样做,我会删除它。
    【解决方案3】:

    您能否不将ios_base 精度设置为cfloat.h 平台上有效数字中的最大小数位数,然后使用ios_base::setf() 将浮点格式更改为科学格式,这将删除任何浮点数的尾随零(您只需要修剪末尾的指数)?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-02-07
      • 1970-01-01
      • 2018-02-28
      • 1970-01-01
      • 2018-02-22
      相关资源
      最近更新 更多