-6

这是 C 程序的代码片段,

#include <stdio.h>

int main(int argc, char *argv[]) {

    float kk=2*3/4+4/4+8-2;
    printf("%f",kk);
}

这个程序的输出是 8.000000

用 JAVA 8 编写的相同代码。

class Untitled {
public static void main(String[] args) {
float kk=2*3/4+4/4+8-2;
System.out.println("\n----- Converting to the precision -----\n");
System.out.printf("%f",kk);
System.out.println("\n----- Converting to the Integer -----\n");
System.out.println(kk);
    }
}

这个程序的输出是 8.0 和 println 方法。printf 方法以适当的精度返回值。从 printstream 文档中,我不明白编译器是如何失去精度的。我希望会有一些警告或通知丢失精度的东西。关于如何识别这些类型的陷阱有什么想法吗?提前致谢。

4

4 回答 4

4

如果您查阅printfC 和System.out.printlnJava 的文档,您会发现它们以不同的方式格式化输出。这是因为它们完全不同,我不确定你为什么期望它们产生相同的结果。

如果您想在 Java 中使用 printf 样式的格式,请考虑使用String.format()来格式化输出,或者使用,这仍然可能需要显式格式宽度与CSystem.out.printf()中的默认行为相同(如果未明确指定,则为 6 个小数位,因此您的)。printf8.000000

于 2013-11-05T23:11:45.460 回答
1

在 java 和 C 中,代码float kk=2*3/4+4/4+8-2;都将右侧视为整数......因为没有理由将它们隐式转换为其他任何东西。

结果,答案总是一个整数值(整数除法,例如,即使在浮点数中它是 1.52*3/4也会给出结果)。1

因此,无论如何都没有任何浮点精度,所以没有什么可失去的。

于 2013-11-05T23:15:59.200 回答
1

您也可以printf在 Java 中使用。代替

System.out.println(kk);

System.out.printf("%f", kk);

您不会失去使用 Java 的精确度;只是输出格式不同而已。

于 2013-11-05T23:11:09.793 回答
0

你实际上并没有失去那么多的精度。您可能会丢失一点(我不会深入探讨小细节),但您只能获得 8.0 的原因仅仅是打印命令的不同。JAVA 的四舍五入,而 C 的四舍五入没那么快。

尝试以浮点形式打印不是整数的东西(例如,将答案除以 11),它应该根据需要显示额外的数字。

于 2013-11-05T23:13:17.500 回答