如何解决将我的花车四舍五入到两倍的问题?

时间:2018-11-13 13:52:05

标签: c

我知道在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);

}

1 个答案:

答案 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从来没有任何“舍入”。