Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/70.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_Count_Comma - Fatal编程技术网

C 如何计算小数点前后的数字长度

C 如何计算小数点前后的数字长度,c,count,comma,C,Count,Comma,有人能帮我解决这个问题吗 问题:计算小数点前和小数点后数字的最简单方法是什么 我知道,例如,如果我数9.456,我可以通过除以10来计算逗号前有多少个数字,但它仍然是0.456,那么我应该如何计算逗号后数字的长度?在C 谢谢你的帮助 如何计算小数点之前和之后的数字长度(?) 小心你的愿望 9.456不能准确地表示为double。它不是某种整数*2某种幂的形式 而是使用附近的代表值1。其精确的十进制值对于此任务可能没有多大用处: 9.45599999999999951683093968313187

有人能帮我解决这个问题吗

问题:计算小数点前和小数点后数字的最简单方法是什么

我知道,例如,如果我数9.456,我可以通过除以10来计算逗号前有多少个数字,但它仍然是0.456,那么我应该如何计算逗号后数字的长度?在C

谢谢你的帮助

如何计算小数点之前和之后的数字长度(?)

小心你的愿望

9.456不能准确地表示为
double
。它不是某种整数*2某种幂的形式

而是使用附近的代表值1。其精确的十进制值对于此任务可能没有多大用处:

9.455999999999999516830939683131873607635498046875
//123456789012345678901234567890123456789012345678
在这种情况下,整数计数为1,分数计数为48


相反,一个更实际的问题/答案是:“如何计算四舍五入输出的小数点之前和之后的数字长度?”

这比较容易。使用
“%.*e”
double
打印到一个字符串以执行重载,然后解析输出

所选精度会影响输出:请参阅下面的
99.999

由于我们使用的是四舍五入的十进制输出,因此请避免在不使用
sprintf()
的情况下对其进行编码。除此之外,角落里的情况很多

样本:

#include <math.h>
#include <stdio.h>
//                   -   d   .   xxxxxxxxxxx    e   - eeee \0  spare
#define FMT_N(prec) (1 + 1 + 1 + ((prec) - 1) + 1 + 1 + 4 + 1 + 5)
#define FMT_E(prec) (1 + 1 + 1 + ((prec) - 1) + 1)
#define FMT_Z(prec) (1 + 1 + 1 + ((prec) - 1) - 1)

void get_int_fraction_count(double a, int precision, int *integer, int *fraction) {
  *integer = *fraction = 0;
  if (!isfinite(a) || a == 0.0) {
    return;
  }
  char buf[FMT_N(precision)];
  snprintf(buf, sizeof buf, "% .*e", precision - 1, a);
  int expo = atoi(&buf[FMT_E(precision)]);
  int digit_count = precision;
  for (char *z = &buf[FMT_Z(precision)]; *z == '0'; z--) {
    digit_count--;
  }
  // printf("expo:%d digit_count:%d\n", expo, digit_count);
  if (expo >= 0) {
    *integer = expo + 1;
    if (digit_count > *integer) {
      *fraction = digit_count - *integer;
    }
  } else {
    *fraction = digit_count - expo - 1;
  }
}
输出

a: 9.456e+00 i:1 f:3
a: 9.45600000000000e+00 i:1 f:3
a: 1.230e-01 i:0 f:3
a: 1.230e-02 i:0 f:4
a: 1.798e+308 i:309 f:0
a: 4.941e-324 i:0 f:327
a: 1.000e+02 i:3 f:0
a: 9.9999e+01 i:2 f:3


1 5323254759551926*2-49

因此我们今天将使用
strchr

void getdigitcount(const char number[], size_t *before, size_t *after)
{
    size_t len = strlen(number);
    char *decimal = strchr(number, '.');
    if (!decimal) {
        *before = len;
        *after = 0;
        return;
    }
    while (number[len - 1] == '0')
        len--; /* get rid of trailing zeroes -- if that's wrong get rid of this loop */
    *before = decimal - number;
    *after = len - (decimal - number);
 }
键为
strchr
查找小数点。前面的计数是一个减法,后面的计数是另一个减法。但我们要处理小数点找不到的问题


关于C语言,人们期望程序员能够使用整个语言。没有指针,这个任务很烦人。

计算机可能会将您的示例解释为
9.45599999999965362431
,您需要阅读。。。或者(非常)简单,将输入作为字符串处理!这可能对你有帮助。同时,考虑到9.456是否不同于9.4560,这是一个语境问题。一般来说,一个数字中有多少个小数位数的选项通常是(1)你说有多少,和(2)在(文本)输入中有多少。如果你说的是十进制数,那将是字符串格式,因为浮点变量不是以十进制存储的,或具有一定的小数位数。如果输入来自
stdin
,则直接将其读入字符串,找到小数点(如果有)并计算每边的数字(但不包括前导或尾随的零)。对此问题有太多可能的解释。其他评论也在试图提供帮助,但让我们从这个开始。你有绳子还是双人的?
a: 9.456e+00 i:1 f:3
a: 9.45600000000000e+00 i:1 f:3
a: 1.230e-01 i:0 f:3
a: 1.230e-02 i:0 f:4
a: 1.798e+308 i:309 f:0
a: 4.941e-324 i:0 f:327
a: 1.000e+02 i:3 f:0
a: 9.9999e+01 i:2 f:3
void getdigitcount(const char number[], size_t *before, size_t *after)
{
    size_t len = strlen(number);
    char *decimal = strchr(number, '.');
    if (!decimal) {
        *before = len;
        *after = 0;
        return;
    }
    while (number[len - 1] == '0')
        len--; /* get rid of trailing zeroes -- if that's wrong get rid of this loop */
    *before = decimal - number;
    *after = len - (decimal - number);
 }