【问题标题】:C print long long to floatC print long long to float
【发布时间】:2017-05-06 08:38:36
【问题描述】:

我有两个 long long (int) 值,我想以 3 位精度的浮点格式打印它们的除法。我已经读过了 printf and long double ,但所有这些建议都会导致 nan 作为 printf 的结果。 例如

  long long a = 123123123;
  long long b = 123123124;
  printf("%d\n", b/a);
  printf("%.3f", b/a);

第一次打印将输出1(如预期),但第二次输出0.000而不是1.xxx

【问题讨论】:

  • 你必须明确地转换:printf("%.3f", (float)b/a);
  • 您必须先将 a 或 b 之一转换为浮点数。试试:a/(double)b​​。
  • 第一个也是错误的:%d 采用 int,而不是 long long int。为此,您需要%lld

标签: c


【解决方案1】:

除了第一个,printf 不检查传递的参数或字符串的格式化参数的数量与参数的对比(大多数编译器会警告您出现问题,但这不能保证)

b/along long 类型。

因此,即使第一种 printf 有效,使用它会更好

printf("%lld\n", b/a);

第二个printf 根本不起作用,因为参数被解释为double,但没有转换(尽管传递float 也可以:How does printf and co differentiate beetween float and double),由于@ 的可变特性987654331@ 函数(你几乎可以将任何东西作为参数传递,所以它不安全)。您必须将其显式转换为double,例如:

printf("%.3f", (double)b/a);

请注意,(double)(b/a) 也可以使用,但您会丢失小数部分

【讨论】:

  • printf %f 采用 double,而不是 float
  • 不,printf %lf 在 C89 中具有未定义的行为,在 C99 中等同于 %f
  • 好的,这是给scanf的。但是投射到float 有效,即使它不是最佳的:stackoverflow.com/questions/6395726/…。但是,已编辑,因为最好转换为 double
  • 我用了这么久的演员表..但还是忘了他们:|
猜你喜欢
  • 1970-01-01
  • 2013-12-23
  • 1970-01-01
  • 1970-01-01
  • 2013-12-24
  • 2011-11-27
  • 2013-09-25
  • 1970-01-01
  • 2010-11-30
相关资源
最近更新 更多