2011-05-16 34 views
-3

嘿所以我正在返回有小数,整数,或总数的数的函数,但一直未能使其与以下任一方式工作:如何计算一个大双数中有多少个小数位?

  • 乘以一个真正大量像10十亿不会因为innacurate路电脑店小数的工作,使2.3 2.2999575697

  • 使用字符串流将数字转换为字符串,并计算字符不起作用,因为它要求您将流设置为精确度如果未设置为实际的小数位数,则要么带走要么添加不需要的'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

而不是给我们你的示例代码,它可能会更好,如果你能给出一个更清晰的问题描述。请提供一些数字和你期望的结果的例子。 – 2011-05-16 01:37:19

+2

从你以前的问题来看,我建议阅读浮点实际工作原理。那么你就会明白为什么“双数中的小数”没有多大意义。 – hammar 2011-05-16 01:44:14

+0

可能使用http:// stackoverflow。com/questions/4738768/printing-double-without-losing-precision – ThomasMcLeod 2011-05-16 03:42:07

回答

2

只有一些十进制数可以以精确形式存储为浮点数。由于这个原因,没有办法确定对于任何十进制数来说,有多少小数位是非常重要的,这是不正确的。作为哈马尔建议,在浮点存储格式读了,我相信每个程序员都应该有这样的低层次的东西的一些知识:d

乘以一个真正大量像10十亿,因为不工作的计算机存储小数的方式,使得2.3 2.2999575697

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

编辑更准确的解释。

+1

二进制浮点数是一个精确的表示,它只是有一些分数可以用有限小数表示,但不能用有限二进制表示。 – phoog 2011-05-16 02:39:07

+0

双精度数字包含52位重要的二进制数字或15.95位重要的十进制数字(53记录2)。但是,最多需要17位十进制数来区分相邻的double值。 – ThomasMcLeod 2011-05-16 03:40:47

+0

@phoog我应该使用措辞:浮点数不能是一些十进制数的精确表示。这个问题在任何解决这个问题的解决方案中都会经常出现,试图解决这个问题并没有太多的收获。 – Snyex 2011-05-16 04:05:58

3

如果你想知道的十进制数字,一个最大数量long double可以存储,这个值是在cfloat定义的恒定LDBL_DIG可用。请注意,此数目实际上是一个近似为值被存储在二进制内部,因此值的范围不是10.

0

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

相关问题