如何计算出大双精度中有多少个十进制数字

How to figure out how many decimal digits are in a large double?

本文关键字:双精度 多少 十进制数字 何计算 计算      更新时间:2023-10-16

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

    乘以
  • 像 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;};

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

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

乘以

像 100 亿这样的大数字是行不通的,因为计算机存储小数的天真方式,使 2.3 2.2999575697

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

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

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