如果你在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