C 如何设置有理数的十进制展开的精度级别
我试图打印出C中有理数的十进制展开式。我遇到的问题是,当我用分子除以分母时,我失去了精度。C在我不想重复的部分时将其舍入 例如,1562/4995=0.3127127。。。但在我的程序中,我得到1562/4995=0.312713。正如你所看到的,我需要的电话号码的一部分已经丢失了 有没有办法指定C来保持更高级别的十进制精度 我试图将结果声明为双精度、长精度双精度和浮点型。我还尝试将展开式拆分为两个整数,用“.”分隔 然而,这两种方法都没有成功C 如何设置有理数的十进制展开的精度级别,c,C,我试图打印出C中有理数的十进制展开式。我遇到的问题是,当我用分子除以分母时,我失去了精度。C在我不想重复的部分时将其舍入 例如,1562/4995=0.3127127。。。但在我的程序中,我得到1562/4995=0.312713。正如你所看到的,我需要的电话号码的一部分已经丢失了 有没有办法指定C来保持更高级别的十进制精度 我试图将结果声明为双精度、长精度双精度和浮点型。我还尝试将展开式拆分为两个整数,用“.”分隔 然而,这两种方法都没有成功 int main() { int nume
int main() {
int numerator, denominator;
numerator = 1562;
denominator = 4995;
double result;
result = (double) numerator / (double) denominator;
printf("%f\n", result);
return 0;
}
我期望输出为1562/4995=0.3127127。。。但实际输出为1562/4995=0.312713默认情况下,
%f
格式说明符toprintf
在小数点后显示6位数字。如果要显示更多数字,请使用精度说明符:
printf("%.10f\n", result);
另外,
double
类型只能准确地存储大约16位小数精度。您需要更改输出格式,如下所示:
printf("%.10lf\n", result);
注意两件事:
后面的值指定所需的小数精度(此处为10位小数)f
之前添加了l
,以显式地声明参数是double
而不是(单精度)float
printf
函数,严格来说没有必要包含l
修饰符。但是,当您开始使用“对应的”scanf
功能进行输入时,如果没有该功能,将产生警告和(可能)未定义的行为:
scanf("%f", &result); // Not correct
scanf("%lf", &result); // Correct
如果你只想打印,你可以用小学时教的长除法来完成:
#include <stdio.h>
/* Print the decimal representation of N/D with up to
P digits after the decimal point.
*/
#define P 60
static void PrintDecimal(unsigned N, unsigned D)
{
// Print the integer portion.
printf("%u.", N/D);
// Take the remainder.
N %= D;
for (int i = 0; i < P && N; ++i)
{
// Move to next digit position and print next digit.
N *= 10;
printf("%u", N/D);
// Take the remainder.
N %= D;
}
}
int main(void)
{
PrintDecimal(1562, 4995);
putchar('\n');
}
#包括
/*打印N/D的十进制表示形式,最多为
小数点后的P位。
*/
#定义P60
静态void PrintDecimal(无符号N,无符号D)
{
//打印整数部分。
printf(“%u.”,不适用);
//拿剩下的来说。
N%=D;
对于(int i=0;i
并非完全相同,但请参见。它可能会给你一些想法。考虑一下将浮点值指定为0.3127127…
很可能不准确。float
通常只有7位小数精度。在这种情况下,l
标志无效。传递给变量函数的float
隐式提升为double
。@dbush不是result
实际上是double
,根据问题?@dbush不必要,是;无效,不!但是习惯于指定显式格式很好。谢谢你给我看这个,我从来没有想过这样做,它真的很聪明