今晚,还在继续调试我的430+LCD12832的串口屏,不过,遇到了一个小小的麻烦,就是浮点数转成字符串显示的问题,通常都是走snprintf的捷径,但是在小容量单片机面前就失灵了,在使用snprintf函数的时候,会提示空间不足的错误,看来这printf类的函数还是个空间杀手,没办法了,只能自己写个函数实现了。我在此献个小丑,把代码贴出来,代码肯定是存在不足的,例如我说两点:1. 某些数在计算过程中会引入误差,导致输出不准确。如输入-0.1234f,输出会变成-0.12339
2. 小数部分结尾的0没有做特殊处理,不过代码稍微改动一下即可实现。
欢迎大家讨论与指教,有没有更精确的实现方法?
下面贴出代码:
- #include <stdio.h>
- void recurParse(int n, char** str, unsigned int* restSize) {
- if (n < 10) {
- if (*restSize > 1) {
- **str = n + '0';
- (*str)++;
- *restSize -= 1;
- }
-
- }
- else {
- recurParse(n / 10, str, restSize);
- if (*restSize > 1) {
- **str = n % 10 + '0';
- (*str)++;
- *restSize -= 1;
- }
- }
- }
- /*
- *outBuffer: 输出字符串的缓冲区
- *bufferSize: 输出字符串缓冲区的大小
- *in: 要转换的浮点数
- *decCount: 输出字符串保留的小数位数
- *返回值: 写入到缓冲区中的字符个数(不包含\0)
- */
- int float2String(char* outBuffer, unsigned int bufferSize, float in, unsigned int decCount) {
- int n;
- float dec;
- unsigned int restSize = bufferSize;
- if (restSize == 0) return 0;
- n = (int)in;
- dec = in - n;
- if (in < 0) {
- if (restSize > 1 && !(n == 0 && decCount == 0)) {
- *outBuffer++ = '-';
- --restSize;
- }
- n = -n;
- }
- if (dec < 0) {
- dec = -dec;
- }
- recurParse(n, &outBuffer, &restSize);
- if (decCount != 0) {
- if (restSize > 1) {
- *outBuffer++ = '.';
- --restSize;
- }
- }
- while (decCount) {
- dec *= 10;
- n = (int)dec;
- dec -= n;
- if (restSize > 1) {
- *outBuffer++ = n + '0';
- --restSize;
- }
- else {
- break;
- }
- decCount -= 1;
- }
- *outBuffer++ = NULL;
- return bufferSize - restSize;
- }
- int main() {
- char o[100];
- float test[] = { -123.456, 1987.9998, -0.1234f, -9999.876, 0.1, 0.00002, 0.33, -0.08, -9.99, 10.04, -100.63, 1001.332 };
- int i, n;
- for (i = 0; i < sizeof(test) / sizeof(float); i++) {
- n = float2String(o, sizeof(o)/sizeof(char), test[i], 6);
- printf("%d: %s\n", n, o);
- }
- printf("%f\n", -0.1234f);
- return 0;
- }
此内容由EEWORLD论坛网友lcofjp原创,如需转载或用于商业用途需征得作者同意并注明出处