有什么办法既不失去精度又能得到价值?

Is there any way to not lose the precision and still get the value?

首先,我完全是 C 语言的初学者,之前有 Java 和 Python 的编程经验。该程序的目标是添加 2 个数字。在玩代码时,我遇到了精度问题。问题是在我添加 2 个数字时引起的 - 1 个是 float 数据类型,另一个是 double 数据类型。

代码:

#include <stdio.h>

int main() {
    double b=20.12345678;
    float c=30.1234f;
    printf("The Sum of %.8f and %.4f is= %.8f\n", b, c, b+c);
    return 0;
}

输出:

20.12345678 和 30.1234 的总和= 50.24685651

然而,正确的输出应该是:50.24685678

浮点值精确到小数点后 6 位,输出也是如此。 我尝试将值显式转换为 double 类型,但仍然没有用。

PS:当我将变量类型从float转换为double时,输出是精确的;但是有没有其他方法可以添加 float 和 double 整数而不弄乱它们的数据类型? 谢谢。

分配给 c 的值无法准确表达,因此它被分配了下一个最接近的值。当打印到小数点后 4 位时你看不到,但如果你打印 8:

printf("The Sum of %.8f and %.8f is= %.8f\n", b, c, b+c);

输出:

The Sum of 20.12345678 and 30.12339973 is= 50.24685651

所以常量 30.1234f 对于您要进行的计算来说已经不够精确了。

float 仅保证 6 位十进制数字的精度,因此任何带有 float 的计算(即使其他操作数是 double,即使您将结果存储到a double) 只会精确到6位数字。

如果您需要更高的精度,请将自己限制在 doublelong double。如果您需要超过 10 位小数位的精度,那么您需要使用本机浮点类型和库函数以外的东西。您要么需要自己动手,要么使用像 GNU MP 这样的任意精度数学库。