看看本身剛入門時寫的東西!竟然還用了一年!!要留下來,證實本身的成長。ui
char * tr_dtostr(double value, int declen)rem
{ char * pstring = NULL; int64_t intval = 0; uint16_t effenum = 0; uint16_t renum = 0; uint32_t i = 0; int64_t longnum = 0; uint64_t plongnum = 0; int64_t anum = 0; int64_t bnum = 0; //有效位長度若是<0 或 >19位則等於19位 if (declen <= 0 || declen > 19) { declen = 19; } pstring = (char *) malloc(21); memset(pstring, 0, 21); intval = (int64_t) value;//獲取整數值 if (value < 0.0)//肯定負值 { if (intval == 0)//肯定整數位爲0 { char chnum[21] = { 0 }; sprintf(pstring, "%s", "-"); sprintf(chnum, "%lld", intval); strcat(pstring, chnum); strcat(pstring, ".");//存入「-0.」 } else//整數位不爲0存入「負數.」 { sprintf(pstring, "%lld", intval); strcat(pstring, "."); } if (intval != 0)//若是 { renum = strlen(pstring) - 2; } else { renum = strlen(pstring) - 3; } effenum = 15 - renum; } else { sprintf(pstring, "%lld", intval); strcat(pstring, "."); if (intval != 0) { renum = strlen(pstring) - 1; } else { renum = strlen(pstring) - 2; } effenum = 15 - renum; } if (intval == 0) { anum = (value) * pow(10,effenum); bnum = intval * pow(10,effenum); longnum = anum - bnum; plongnum = labs(longnum); if (value > 0.0) { anum = (value + 1) * pow(10,effenum); } else if (value < 0.0) { anum = (value - 1) * pow(10,effenum); } else if (value == 0) { sprintf(pstring, "%s", "0"); return pstring; } } else { anum = value * pow(10,effenum); bnum = intval * pow(10,effenum); longnum = anum - bnum; plongnum = labs(longnum); } if (plongnum == 0) { //小數部位全爲0 pstring[strlen(pstring)-1] = 0; return pstring; } else { char chnum[20] = { 0 }; uint8_t sursavelen = 0;//剩餘應該保存個數 int invallen = 0;//小數部位轉爲整數後的大小 int vallen = 0; //小數部位非零數的個數(包括非零數中間0的個數) int tailzerolen = 0;//小數部位轉爲整數後尾部補的0的個數 int index = 0; uint32_t frontzeronum = 0;//小數部位緊跟在小數點後有效0的個數 sursavelen = declen; // 剩餘應保存個數初始值爲需保留小數個數 for (index = 0;; index++) { uint64_t div = 0; uint64_t rem = 0; uint64_t squ = 0; squ = pow(10, index + 1); div = plongnum / squ; rem = plongnum % squ; if (rem == 0)//餘數爲0,尾零個數+1 { tailzerolen++; } if (div >= 1)//除數>= 1, 整數個數+1 { invallen++; } else { invallen += 1;//加上第一位 break; } } vallen = invallen - tailzerolen; //計算小數部位緊跟在小數點後有幾個0 for (index = 0;; index++) { uint64_t temnum; uint64_t div; uint64_t squ = pow(10, invallen + index); temnum = labs(anum) % squ; div = labs(anum) / squ; if (temnum == plongnum && div == intval) { break; } else if (temnum == plongnum) { frontzeronum++; } else { frontzeronum--; break; } } //將緊跟在小數點後的前0寫入字符串 for (i = 0; i < frontzeronum; i++) { strcat(pstring, "0"); if (sursavelen > 0) { sursavelen--;//剩餘應保留個數-1 } } if (sursavelen > vallen) { sursavelen = vallen; } if (sursavelen == 0) { uint8_t len = strlen(pstring); if (intval == 0) { for (i = 0; i < len; i++) { pstring[len - i - 1] = 0; } pstring[0] = '0'; } else { for (i = 0; i < frontzeronum + 1; i++) { pstring[len - 1 - i] = 0; } } } else { sprintf(chnum, "%lld", plongnum);//將小數點後數轉換爲字符串 strncat(pstring, chnum, sursavelen); } } return pstring; }