如何在C中格式化小数?

时间:2015-04-28 06:58:28

标签: c

这是我的打印声明:

printf("%d     %f\n",kPower, raisePower); 

这是我的输出:

-4     0.000100
-3     0.001000
-2     0.010000
-1     0.100000
0     1.000000
1     10.000000
2     100.000000
3     1000.000000
4     10000.000000

我希望它像这样打印:

enter image description here

更新

所以我把我的积极价值排成一行:

-4            0.0
-3            0.0
-2            0.0
-1            0.1
0            1.0
1           10.0
2          100.0
3         1000.0
4        10000.0

到目前为止,这是我的新代码:

printf("%d     %10.1f\n",kPower, raisePower);

我不知道,我应该制作一个for循环以不同的格式打印每一个(积极结果与阴性结果)吗?

7 个答案:

答案 0 :(得分:3)

#include <stdio.h>

char *get_number_formatted(double f)
{
    static char buf[128]; // this function is not thread-safe
    int i, j;

    i = snprintf(buf, 128, "%20.10f", f) - 2;

    for (j = i - 8; i > j; --i)
        if (buf[i] != '0')
            break;

    buf[i + 1] = '\0';
    return buf;
}

int main(void)
{
    int i;
    for (i = -4; i < 5; ++i)
        printf("%5d %s\n", i, get_number_formatted(pow(10.0, i)));
   return 0;
}

http://ideone.com/KBiSu0

输出:

   -4         0.0001
   -3         0.001
   -2         0.01
   -1         0.1
    0         1.0
    1        10.0
    2       100.0
    3      1000.0
    4     10000.0

printf()无法打印变量长度的十进制数字,所以基本上我所做的是将格式化的数字打印到缓冲区然后剪切超出的零。

答案 1 :(得分:2)

首先尝试使用<select class="form-control"> <option>All</option> <option>Filter 1</option> <option>Filter 2</option> <option>Filter 3</option> </select> 中的pow()计算权力,然后:

您可以使用%10f在数字前面加上示例总共10个空格中的空格:

math.h

来源:cplusplus.com

答案 2 :(得分:2)

基本上你可以使用变长来执行此操作:

printf("%d %.*lf", kPower, -kPower, raisePower);

优于其他方法的优点是此方法不需要任何额外的缓冲区

答案 3 :(得分:2)

modf的帮助下,您可以使用%g跳过尾随零,\b跳过前导零:

#include <stdio.h>
#include <math.h>

int main(void)
{
    int i, iarr[] = {-4, -3, -2, -1, 0, 1, 2, 3, 4};
    double darr[] = {0.0001, 0.001, 0.01, 0.1, 1., 10., 100., 1000., 10000.};
    double intpart, fractpart;

    for (i = 0; i < 9; i++) {
        fractpart = modf(darr[i], &intpart);
        if (fractpart == 0.0)
            printf("%10d%10d.0\n", iarr[i], (int)intpart);
        else
            printf("%10d%10d\b%g\n", iarr[i], (int)intpart, fractpart);
    }
    return 0;
}

输出:

    -4         0.0001
    -3         0.001
    -2         0.01
    -1         0.1
     0         1.0
     1        10.0
     2       100.0
     3      1000.0
     4     10000.0

答案 4 :(得分:1)

试试这个示例代码

float y[7]={0.000100f,0.0010f,0.0100,0.1000f,1.0f,10.000f,100.00f};
int a[7]={-4,-3,-2,-1,0,1,2};
for(int i=0;i<7;i++)
    printf("%2d%20f\n",a[i],y[i]);

输出就是这样。

enter image description here

答案 5 :(得分:1)

您可以使用sprintf然后修剪零。这与@Havenard的答案是一样的,但是在零上写空间而不是剪切字符串。 我的C风格与FWIW有些不同。我的风格是,我不想在脑海中计算或做任何算术;这就是C优化器的用途:)。

#include <math.h>
#include <stdio.h>
#include <string.h>

int main() {
    int kPower;
    for(kPower=-4; kPower<5; kPower++){
        enum { bufsize = 2+5+10+1+4+1+1 };
        char buf[bufsize];
        int j,n,i;
        double raisePower = pow(10,kPower);
        //printf("%2d     %10.4f\n",kPower,raisePower);
        snprintf(buf,bufsize,"%2d     %10.4f\n",kPower,raisePower);
        j=strchr(buf,'.')-buf;
        j+=1;
        n=strchr(buf+j,'\n')-buf;
        for (i=n-1; i>j; i--)
            if (buf[i]=='0')
                buf[i]=' ';
            else
                break;
        printf("%s",buf);
    }   
    return 0;
}

输出:

-4         0.0001
-3         0.001 
-2         0.01  
-1         0.1   
 0         1.0   
 1        10.0   
 2       100.0   
 3      1000.0   
 4     10000.0   

答案 6 :(得分:0)

像这样使用printf:

printf( "%5d %10.1f\n",kPower, raisePower);

this will result in kPower being printed, 
    right justified, 
    in 5 columns
    - sign in the right place

this will result in raisePower being printed with:
    10 columns
    leading 0s replaced by spaces
        except 1 digit (could be 0) to the left of the decimal point
    1 (rounded) digit to the right of the decimal point
    - signs being printed at the proper location
    decimal point being aligned