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