我需要打印一个 16 位有效数字的浮点值。
现在当我打印时,它会打印出来
即2.555556
当我希望它打印出来时:2.555555555555556 /// 总共 16 位
我的 printf 说明符目前是:“%20.18lf”
想法?
如果该值是 type float
,那么小数点后的有效数字可能不会超过 7 位。如果它是 type double
,您可以获得大约 15 个。根据系统,long double
可能不会比double
;更精确。在我的小数点后,我得到大约 17 位有效数字。
大多数浮点代码使用 type double
; float
精度要低得多,而且通常不会明显更快。
我有点惊讶你得到了2.555556
而不是像格式这样2.555555582046508789
的东西。"%20.18lf"
顺便说一下,l
(小写 L)不是必需的。double
is的格式"%f"
和to 的float
参数printf
被提升为double
,因此和"%f"
都是正确的。的格式是.float
double
long 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
以下代码运行良好(您必须启用 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
。
所以你在其他地方有错误。通常,您必须发布一个重现问题的最小自洽代码示例。否则你就靠自己了。
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 );