1.起因:
作業中對接平臺需要將設備的GPS資料傳給平臺,但是平臺采用的不是回呼函式將資料直接作為引數回傳而是格式化的字串命令,所以需要將double型別的gps資料格式化輸出到字串中,專案中之前采用的是sprintf進行格式化輸出,但是通過列印對比發現有精度損失,所以改成先放大資料1000000倍(資料有6位小數),然后整數部分通過做除法獲得,小數部分通過取模運算獲得,
void report_gps_info(double lon,double lat)
{
//some codes
sprintf(gpsinfo,"%.6lf&%.6lf",lat,lon);
//some codes
}
↓
void report_gps_info(double lon,double lat)
{
//some codes
UINT32 enlarged_lat = lat*1000000; //added by xxx to solve the problem of loss of accuracy
UINT32 enlarged_lon = lon*1000000;
sprintf(baseinfo,"%d.%d&%d.%d",enlarged_lat/1000000,enlarged_lat%1000000,enlarged_lon/1000000,enlarged_lon%1000000);
//some codes
}
2.再次出問題:
修改后當時測驗還是有精度損失,不過只在最后一位差了1影響微乎其微就沒怎么在意,于是提交了代碼,merge后隔了幾天分公司同事測驗發現地圖上位置出現了很大偏移,查看log發現是資料經過這個函式處理后出的問題,只有經度錯誤,緯度資料正常,對比查看發現原因是經度資料小數第一位為0,乘1000000后取模讓前面的0出現了丟失導致的,
3.最終解決方案:
最終在取模結果也就是小數部分的格式控制上加了位寬限制解決了問題,
void report_gps_info(double lon,double lat)
{
//some codes
UINT32 enlarged_lat = lat*1000000; //added by xxx to solve the problem of loss of accuracy
UINT32 enlarged_lon = lon*1000000;
sprintf(baseinfo,"%d.06%d&%d.06%d",enlarged_lat/1000000,enlarged_lat%1000000,enlarged_lon/1000000,enlarged_lon%1000000);
//some codes
}
1、%d 普通的整數輸出
2、%6d 整數輸出,寬度是6位,不足左邊補空格
3、%06d 整數輸出,寬度是6位,不足左邊補數字0
4、%-6d 整數輸出,寬度是6位,不足右邊補空格
5、%.6f 輸出小數,即保留小數點后6位
4.反思:
當時提交代碼前測驗所處位置的gps資料小數位第一位正好不為0就沒注意到這個問題,考慮問題真的不夠全面,,,在處理這種資料問題時應該更嚴謹和考慮更多種情況的,突然又想起上次改動最小系統進行OTA升級代碼時沒有加宏控,從而導致在升級時呼叫非最小系統代碼讓系統卡死的事,也是因為考慮問題不全面,自測流程也不完整導致的,將這些經歷記錄于此,希望以后不再踩此類的坑,
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/547627.html
標籤:其他
上一篇:NodeJs的模塊化和包
下一篇:Maven 中<optional>true</optional>和<scope>provided</scope>之間的區別
