首先,我完全是C语言的初学者,之前有Java和Python编程的经验。这个程序的目标是将两个数字相加。在处理代码时,我遇到了一个精度问题。这个问题是在我添加2个数字时引起的-一个是float数据类型,另一个是double数据类型。
代码:
#include <stdio.h>
int main() {
double b=20.12345678;
float c=30.1234f;
printf("The Sum of %.8f and %.4f is= %.8fn", b, c, b+c);
return 0;
}
输出:
20.12345678和30.1234的和= 50.24685651
但是,正确的输出应该是:50.24685678float值精确到小数点后6位,输出也是如此。我尝试将值显式转换为double类型,但仍然没有用。
PS:当我将变量类型从float转换为double时,输出是精确的;但是,有没有其他方法可以在不影响浮点数和双精度数数据类型的情况下添加它们呢?谢谢你。
float
仅保证6位十进制数字的精度,因此任何使用float
的计算(即使其他操作数是double
,即使您将结果存储到double
)将仅精确到6位数字。
如果您需要更高的精度,那么将自己限制为double
或long double
。如果需要超过10个十进制数字的精度,则需要使用原生浮点类型和库函数以外的东西。您要么需要自己滚动,要么使用任意精度数学库,如GNU MP。
分配给c
的值不能精确地表示,所以它被分配到下一个最接近的值。当输出到小数点后4位的时候你不会看到这个但是当你输出8的时候你会看到它:
printf("The Sum of %.8f and %.8f is= %.8fn", b, c, b+c);
输出:
The Sum of 20.12345678 and 30.12339973 is= 50.24685651
所以对于你要做的计算来说,常数30.1234f
已经不够精确了。