如果你在C中没有%f,那么如何编写一个C程序来打印小数,最多2个小数位而不是%f?

请帮我写一个关于我的问题的C程序。

问题 – 在C.中没有%f如何写一个C程序打印十进制数最多2位小数而不使用%f

 #include  #include  int main(void) { double num = 3.1416, a, b; b = modf(num, &a) * 10000; printf("%d.%d\n", (int)a, (int)b); return 0; } 

正如@mch所指出的,它不适用于像3.04这样的数字,这是一个有效的解决方案( Martin提供 ):

 #include  #include  void dbl2str(char *s, double number, int decimals) { double integral, fractional, epsilon = 1e-9; double round = 0.5 * pow(10, -decimals); int n, i; fractional = modf(number + round + epsilon, &integral); n = sprintf(s, "%d%c", (int)integral, decimals ? '.' : 0); for (i = 0; i < decimals; i++) { fractional *= 10; s[n + i] = '0' + (int)fractional; fractional = modf(fractional, &integral); } s[n + i] = '\0'; } int main(void) { char s[32]; dbl2str(s, 3.1416, 4); printf("%s\n", s); dbl2str(s, 3.159, 4); printf("%s\n", s); dbl2str(s, 3.05, 3); printf("%s\n", s); return 0; } 

输出:

 3.1416 3.1590 3.050 

为什么我们需要任何黑客攻击? 让我们按标准进行

如果浮点数据是单精度浮点格式

然后我会采用格式规范。

http://en.wikipedia.org/wiki/Single-precision_floating-point_format

这里有32位浮点数

 Sign bit: 1 bit Exponent width: 8 bits Significand precision: 24 bits (23 explicitly stored) 

所以你可以解码这些东西并使用%d.%02d进行打印以显示积分和2位小数

我会做以下事情:

 float f = 23.48987; int integerPart = (int)f; // integerPart = 23 int decimalPart = (int)(f*100 - integerPart*100); // decimalPart = 48 printf("%d.%02d", integerPart, decimalPart); // printed value - 23.48