我知道在C语言中默认情况下,当您声明浮点数时,它会自动保存为double值;如果您希望将其保存为浮点数,则必须这样声明它
float x = 0.11f
但是如果我的x值来自scanf怎么办?如何做到在打印时不会四舍五入? 这是我的代码,谢谢。
#include <stdio.h>
int main() {
float number = 0;
float comparison;
do{
printf("\nEnter a number: ");
scanf("%f", &comparison);
if(comparison > number) {
number = comparison;
}
}while(comparison > 0);
printf("The largest number enteres was: %f\n\n", number);
}
答案 0 :(得分:0)
带有如果我的x值来自scanf,该怎么办?如何做到在打印时不会四舍五入?
scanf
指令的 %f
将读取输入并将其转换为float
(不是double
)。如果匹配的文本与精确地表示为float
的数字不对应,则在此阶段将进行四舍五入。别无选择。
当您将float类型的参数传递给printf()
进行打印时,它将 提升为double
类型。该功能的签名要求这样做。但是类型double
可以完全代表类型float
的所有值,因此此升级不涉及任何舍入。 printf
对%f
指令的处理与此自动升级保持一致:相应的(升级后的)自变量应为double
类型。
有多种方法可以准确地重现输入,具体取决于您愿意对该输入施加什么约束。最通用的方法是以字符串形式读取,存储和打印数据 ,即使这样做也很复杂。
如果您希望对支持逐字复制的最大小数范围和精度进行限制,则可以通过在{{1 }}字段指令:
printf
如果您想使用内置的浮点格式并且还避免附加尾随零,则可能需要像这样的显式精度或float f;
scanf("%f", &f);
printf("%f %.2f %5.2f\n", f, f, f);
指令:
%g
还涉及其他替代方法,例如创建定点或任意精度的十进制数据类型,以及用于读写数据的适当函数。我认为这超出了您目前感兴趣的范围。
注意:“双精度”是“双精度”的缩写,与单精度“浮点数”相反。就存储和表示能力而言,前者是较大的类型。在实际的实现中,从printf("%f %g\n", f, f);
到float
从来没有任何“舍入”。