Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
获取一个数字在c中的小数量?_C - Fatal编程技术网

获取一个数字在c中的小数量?

获取一个数字在c中的小数量?,c,C,我试图得到一个数字在c中的小数量:0.0001->4个小数,354235->5个小数,等等(如果你不知道,逗号后面的数字)。我们的老师说有两种方法可以做到,使用字符串和不使用字符串。我想我不会使用字符串,因为我对字符串没有经验 这就是我想到的 int funzione1(float decimals){ int x=1,c=0,y=1; while (x!=0){ if((decimals - y) > 0){ y = y / 10;

我试图得到一个数字在c中的小数量:0.0001->4个小数,354235->5个小数,等等(如果你不知道,逗号后面的数字)。我们的老师说有两种方法可以做到,使用字符串和不使用字符串。我想我不会使用字符串,因为我对字符串没有经验

这就是我想到的

int funzione1(float decimals){
  int x=1,c=0,y=1;
  while (x!=0){
      if((decimals - y) > 0){
          y = y / 10;
          c++;
      }else{
          decimals = decimals - y;
      }
      if(decimals == 0)
          x=0;
  }
  return c-1;
}
当调用函数时,它应该返回我计算的小数量,但它没有,实际上它陷入了一个无限循环

这段代码背后的想法是对数字“字符串”中的每个数字进行排序,使其为0,然后检查总数是否为0

3.456 c=0

0.456 c=1

0.056 c=2

0.006 c=3

0.000返回c

但这给我留下了两个问题1如何确定逗号前的数字量,比如5564.34234。这段代码不起作用,因为它将在整数为实数0之前计数到8。因此不能返回正确的小数位数。我设计的代码不起作用。只是陷入了一个无限循环。我不知道循环的无限性是在哪里产生的

如何使此代码正常工作

另外,我在Java中找到了这篇关于这个问题的文章:但是它使用字符串,我不喜欢这样,因为我不知道如何使用字符串

编辑:这是我尝试的另一段代码,它失败了,当你输入一个大于1的数字时,输出50,如果数字小于0(我不明白,一点也不明白),无论如何,这是代码:

int funzione1(float decimals){
    int i=0;
    while(decimals!=((int)decimals)){
        i++;
        decimals=decimals*10;
    }
    return i;
}
这里有一个想法:

  • 从一个浮点数开始,比如a=3.0141589
  • 通过减去整数部分,使小数点0之前的部分保留0.0141589
  • 在循环中,将
    a
    乘以10并保存整数部分,这将为您提供一个从0到9的数字列表
  • 从该列表中,导出小数位数
这个算法中有一些有趣的细节需要你去发现,我不会破坏等待你的乐趣或惊喜。

这里有一个想法:

  • 从一个浮点数开始,比如a=3.0141589
  • 通过减去整数部分,使小数点0之前的部分保留0.0141589
  • 在循环中,将
    a
    乘以10并保存整数部分,这将为您提供一个从0到9的数字列表
  • 从该列表中,导出小数位数

这个算法中有一些有趣的细节需要你去发现,我不会破坏等待你的乐趣或惊喜。

你最好的选择是将输入读取为字符串,然后只计算“.”之后的数字。浮点数不是精确的表示形式,即十进制值在内部以二进制形式存储,可能无法精确表示真正的十进制值。然而,每一个二进制表示都是有限位数的十进制数


看看SO中的答案。

您最好将输入读取为字符串,然后只计算“.”后面的数字。浮点数不是精确的表示形式,即十进制值在内部以二进制形式存储,可能无法精确表示真正的十进制值。然而,每一个二进制表示都是有限位数的十进制数


看看SO中的答案。

如果你不关心四舍五入,那么你不需要计算小数位数,你只需要计算二进制位数即可。这是因为10包含2作为一个因子,因此10^n和2^n具有与因子相同的2个数。计算二进制位数的最快方法是获取浮点数的指数

e、 g.二进制0.001取3位小数代表0.125,0.0001取4位小数代表0.0625

你可以得到这个值的小数部分,然后继续乘以2,然后删除整数,就像人们建议的那样,用10(它会给你相同的答案)

或者,您可以在优化解决方案时获得更多乐趣(places功能完成了大部分工作):

#包括
int-saturateLeft(无符号int-n){
n |=(n>4)&0x0f0f)*0x01010101)>>24;
}
整数位数(双位数){
整数指数;
浮点尾数=frexp(数值和指数);
/*我们正在寻找的答案由
(尾数使用的位数)-指数。
*/
无符号尾数=scalbnf(尾数,32);
/*也可以通过以下方式获得:

整数尾数=*(无符号*)&尾数如果你不关心四舍五入,那么你就不需要计算小数位数,你只需要计算二进制位数。这是因为10包含2作为因子,因此10^n和2^n具有与因子相同的2位数。计算二进制位数的最快方法是获得flo的指数点号

e、 g.二进制0.001取3位小数代表0.125,0.0001取4位小数代表0.0625

你可以得到这个值的小数部分,然后继续乘以2,然后删除整数,就像人们建议的那样,用10(它会给你相同的答案)

或者,您可以在优化解决方案时获得更多乐趣(places功能完成了大部分工作):

#包括
int-saturateLeft(无符号int-n){
n |=(n>4)&0x0f0f)*0x01010101)>>24;
}
整数位数(双位数){
整数指数;
浮点尾数=frexp(数值和指数);
/*我们正在寻找的答案由
(尾数使用的位数)-指数。
*/
无符号尾数=scalbnf(尾数,32);
/*也可以通过以下方式获得:

intMantissa=*(unsigned*)&尾数考虑我的基于字符串的解决方案:

#包括
#包括
#包括
#包括
#包括
整数个小数(双x)
{
int-cnt;
char*ptr;
char str[20]={0};
//以分数pa为例
#include <math.h>

int saturateLeft (unsigned int n) {
  n |= (n <<  1);
  n |= (n <<  2);
  n |= (n <<  4);
  n |= (n <<  8);
  n |= (n << 16);
  return n;
}

int NumberOfSetBits(int i)
{
  i = i - ((i >> 1) & 0x55555555);
  i = (i & 0x33333333) + ((i >> 2) & 0x33333333);
  return (((i + (i >> 4)) & 0x0F0F0F0F) * 0x01010101) >> 24;
}

int places (double num) {
  int exponent;
  float mantissa = frexp (num, &exponent);

  /* The answer we are looking for is given by the 
     (number of bits used by mantissa) - the exponent.
  */

  unsigned intMantissa = scalbnf (mantissa, 32);
  /* Could also be got by doing:
     intMantissa = *(unsigned *)&mantissa << 9;
  */

  /* To work out how many bits the mantissa covered we 
     need no gaps in the mantissa, this removes any gaps.
  */

  intMantissa = saturateLeft (intMantissa);
  int bitCount = NumberOfSetBits (intMantissa);

  /* bitCount could also be found like this:
     intMantissa = ~intMantissa;
     int bitCount = 32 - ilogb (intMantissa) - 1;
  */

  int result = bitCount - exponent;
  if (result < 0)
    return 0;

  return result;
}