以下是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);
}
}
使用println方法输出此程序为8.0。 printf方法以适当的精度返回值。从printstream文档中,我不了解编译器如何失去精度。我希望会有一些警告或某些东西会通知失去的精确度。,有关如何识别这些类型的陷阱的任何想法?提前致谢。
答案 0 :(得分:4)
如果您参考C中的printf
和Java中的System.out.println
的文档,您将看到它们以不同的方式格式化输出。这是因为它们完全不同,我不确定为什么你期望它们产生相同的结果。
如果要在Java中使用printf样式格式化,请考虑使用String.format()
格式化输出,或使用System.out.printf()
,这仍然可能要求显式格式宽度与{{的默认行为相同1}}在C(which is 6 decimal places if not explicitly specified,因此你的printf
)。
答案 1 :(得分:1)
您也可以在Java中使用printf
。取代
System.out.println(kk);
与
System.out.printf("%f", kk);
你不会因为Java而失去精确度;只是有不同的输出格式。
答案 2 :(得分:1)
在java和C中,代码float kk=2*3/4+4/4+8-2;
将右侧视为整数....因为没有理由将它们强加于其他任何东西。
因此,答案将始终为整数值(整数除法,例如2*3/4
将给出结果1
,即使在浮点数为1.5)。
因此,无论如何都没有任何浮点精度,所以没什么可失去的。
答案 3 :(得分:0)
你实际上并没有失去那么多精确度。你可能会失去一点(我不会深入讨论细节),但你只得到8.0的原因只是打印命令的差异。 JAVA的四舍五入,而C的轮回并不那么快。
尝试以浮点形式打印不是整数的东西(例如,将你的答案除以11),它应该根据需要显示额外的数字。