2

我需要打印一个 16 位有效数字的浮点值。

现在当我打印时,它会打印出来

即2.555556

当我希望它打印出来时:2.555555555555556 /// 总共 16 位

我的 printf 说明符目前是:“%20.18lf”

想法?

4

3 回答 3

3

如果该值是 type float,那么小数点后的有效数字可能不会超过 7 位。如果它是 type double,您可以获得大约 15 个。根据系统,long double可能不会比double;更精确。在我的小数点后,我得到大约 17 位有效数字。

大多数浮点代码使用 type double; float精度要低得多,而且通常不会明显更快。

我有点惊讶你得到了2.555556而不是像格式这样2.555555582046508789的东西。"%20.18lf"

顺便说一下,l(小写 L)不是必需的。doubleis的格式"%f"和to 的float参数printf被提升为double,因此和"%f"都是正确的。的格式是.floatdoublelong double"%Lf"

这是我写的一个测试程序:

#include <stdio.h>
int main(void) {
    const float f        = 23.0/9.0;
    const double d       = 23.0/9.0;
    const long double ld = 23.0L/9.0L;
    printf("%20.18f\n%20.18f\n%20.18Lf\n", f, d, ld);
    return 0;
}

以及我在系统上得到的输出:

2.555555582046508789
2.555555555555555358
2.555555555555555556
于 2012-02-23T19:20:03.753 回答
0

以下代码运行良好(您必须启用 C99,因为%lf说明符不是早期标准的一部分):

#include <stdio.h>

int main(void)
{
        volatile float v = 2.555555555555556;
        printf("%20.18lf\n", v);
        return 0;
}

打印以下内容:

$ gcc -std=c99 -Wall -pedantic -o test ./test.c 
$ ./test 
2.555555582046508789
$ 

如果 value 更短,比如 2.5,它会用零填充它 - 2.500000000000000000

所以你在其他地方有错误。通常,您必须发布一个重现问题的最小自洽代码示例。否则你就靠自己了。

于 2012-02-23T19:20:43.507 回答
0

C float 或 double 不够精确,基本上你需要一个高精度的除法函数。这是我写的。它用于整数除法。您可能需要修改它以进行浮点除法。

int dividend=121, divisor=9;
int quotient,remainder;

//first print out the number before decimal point
quotient=dividend/divisor;
printf("%d", quotient);
remainder=dividend-quotient*divisor;

//print out decimal point
printf(".");

int digit_num=20;//this can be any precision you want

//second we calculate the number after decimal point
for(int i=0;i<digit_num;i++)
{
    remainder=remainder*10;
    quotient=remainder/divisor;
    remainder=remainder-quotient*divisor;
    printf("%d", quotient );
    dividend=remainder;
}

printf("\n");

printf("%d digits after decimal point has been printed out\n", digit_num );
于 2012-02-23T19:57:20.283 回答