计算双

时间:2016-11-11 17:33:15

标签: c

我的问题非常简单。我不知道我怎么能算上双重的特征呢? 例如:13.43,答案是4。

我可以使用(%10),但我无法找到带有数字编号的正确方法。

int i = 0;
double a = 13.43;

while (a != 0)
{
    a = a / 10;
    i++;
}

感谢这些数据,我将创建一个具有正确尺寸的malloc。

感谢。

4 个答案:

答案 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++;
}