使用printf()保留两位小数


71

我正在尝试使用printf()以下方法将数字写到两位小数:

#include <cstdio>
int main()
{
  printf("When this number: %d is assigned to 2 dp, it will be: 2%f ", 94.9456, 94.9456);
  return 0;
}

运行程序时,将得到以下输出:

# ./printf
When this number: -1243822529 is assigned to 2 db, it will be: 2-0.000000

这是为什么?

谢谢。


2
-1234 ...部分是将32位浮点表示为整数。第二部分是错误的,您应该具有%2.2f,但仍然无法解释-0.0000 ...部分。我得到一个正确的结果,除了运行您的代码将额外的2放在浮点数前面。

1
@nvm:出现零是因为94.9456作为双精度(8字节)被压入堆栈,并且%d将前4个字节作为整数处理,随后的4个字节为零,然后代码读取了这4个尾随从第一个数字开始的字节数加上第二个浮点数的前4个字节,并尝试将其视为双精度数。答案是如此之小,以至于定点格式将其视为零。它运行在Intel芯片上,而不是RISC计算机上。
乔纳森·莱夫勒

似乎像“%10f”这样在“ f”之前放置一个整数没有任何效果,就像写“%f”一样?我试过了,只是得到的结果就好像在“%f”所在的位置。

Answers:


141

您想要的%.2f不是2%f

另外,您可能希望将其替换%d%f;)

#include <cstdio>
int main()
{
printf("When this number: %f is assigned to 2 dp, it will be: %.2f ", 94.9456, 94.9456);
return 0;
}

这将输出:

当此数字:94.945600分配给2 dp时,它将是:94.95

有关printf格式选项的完整说明,请参见此处: printf


6

使用:"%.2f"或其他形式。

有关POSIX的权威规范,请参见POSIX规范。printf()格式字符串。请注意,它将POSIX Extras与核心C99规范分开。从Google其他地方看到的评论来看,有一些C ++网站会显示在Google搜索中,但至少有些网站信誉可疑。

由于您使用C ++进行编码,因此您应该避免使用printf()它及其亲戚。



-3

尝试使用%d。%02d之类的格式

int iAmount = 10050;
printf("The number with fake decimal point is %d.%02d", iAmount/100, iAmount%100);

另一种方法是在使用%f进行打印之前,将其类型转换为两倍,如下所示:

printf("The number with fake decimal point is %0.2f", (double)(iAmount)/100);

我的2美分:)


这是一个尝试,不要尝试。
Oussama Ben Ghorbel
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.