我的问题非常简单。我不知道我怎么能算上双重的特征呢? 例如:13.43,答案是4。
我可以使用(%10),但我无法找到带有数字编号的正确方法。
int i = 0;
double a = 13.43;
while (a != 0)
{
a = a / 10;
i++;
}
感谢这些数据,我将创建一个具有正确尺寸的malloc。
感谢。
答案 0 :(得分:3)
感谢这些数据,我将创建一个具有正确尺寸的malloc。
不要担心。只需分配32个字节。
A double
can always be represented in 24 characters or less using scientific notation.
分配超过您需要的几个字节不会增加应用程序的内存使用量。大多数malloc()
实现将对下一个8字节(有时甚至是16或32)的分配进行舍入以进行对齐,因此分配“奇数”数字(如24字节)将导致相同的内存使用量,就像您分配了32个字节一样
答案 1 :(得分:2)
将snprintf()
用于C99或更新版本(对C89使用足够大的缓冲区)。
n = snprintf(NULL, 0, "%.2f", a);
data = malloc(n + 1);
http://pubs.opengroup.org/onlinepubs/9699919799/functions/snprintf.html
答案 2 :(得分:1)
你应该知道,如果你有一个有限的十进制数,你可能没有有限的二进制数。
例如0.1 in Decimal:
0.1 * 2 = 0.2 -> 0
0.2 * 2 = 0.4 -> 0
0.4 * 2 = 0.8 -> 0
0.8 * 2 = 1.6 -> 1
0.6 * 2 = 1.2 -> 1
0.1 * 2 = 0.2 -> 0
0.2 * 2 = 0.4 -> 0
0.4 * 2 = 0.8 -> 0
0.8 * 2 = 1.6 -> 1
0.6 * 2 = 1.2 -> 1
0.1 * 2 = 0.2 -> 0
0.2 * 2 = 0.4 -> 0
0.4 * 2 = 0.8 -> 0
0.8 * 2 = 1.6 -> 1
0.6 * 2 = 1.2 -> 1 (and repeat infinitely)
因此,0.1 in Decimal是0.000110001100011 ...
所以也许这是你的问题,你应该了解mantissa。
这就是为什么有些语言将它们的浮点数记录为分数。
答案 3 :(得分:-1)
也许你可以尝试这个,我没有测试代码,所以我不是100%肯定它会工作,但它应该。我也相信它可以进行优化。试一试,让我们知道!
while ( number/10 > 10 )
{
number = number/10; // Analyzing integer part
quantity++;
}
number = number/10;
if (number == 10)
{
quantity = quantity + 2;
}
else
{
quantity++;
}
quantity++; // One more character for .
remaining = number % 1;
while (remaining/10 > 10)
{
quantity++; // Analyzing decimal part
remaining=remaining/10;
}
remaining = remaining/10;
if (remaining = 10)
{
quantity = quantity + 2;
}
else
{
quantity++;
}