我有一个函数,可以将 gnss 坐标的度数和分钟返回为 DDDMMMMMMM。
为了提取度数部分,我进行了整数除法,如 DDDMMMMMMM/(10^7)。
但问题是,如果 DDD 为 0,我就会丢失符号。
如何保留 DDD 的符号,以便使用它的客户端可以知道它的 0 带有负号。
+0和-0用于定位北、南、东、西。
-0001234567/(10^7) -> -0 度
客户端使用我的返回值,例如:
If(DDD < 0) --> 将其视为负度。 然后,客户端使用返回的度数并在显示屏上绘制为 DDD 或 -DDD 。
功能:
int16 getDegree(int32 degreeMinutes)
{
int16 degree = (int16)(degreeMinutes/10000000); //DDDMMMMMMM/10^7 = DDD
return degree;
}
除了使用另一个变量来检查数字是否为负数(如下所示)之外,我没有看到任何其他方法可以完成:
struct degree
{
int16 degree;
bool isNegative;
}degreeObj;
struct degree getDegree(int32 degreeMinutes)
{
degreeObj.isNegative = false;
degreeObj.degree = (int16)(degreeMinutes/10000000); //DDDMMMMMMM/10^7
if(degreeMinutes < 0) //DDDMMMMMMM as a whole is less than 0
degreeObj.isNegative = true;
return degreeObj;
}
客户端只需检查 DegreeObj.isNegative 是否为 true
最佳答案
我看不出有什么方法可以用整数做你想做的事情。您不能简单地将值的度数部分用作带符号的零整数。
正如其他人所说,很难理解为什么你会关心。如果您不关心值 09059... 更接近 091,那么您为什么关心 -00010... 与 +00010... 不同?也许您真正需要做的是将值四舍五入到最接近的整数度,那么 000 度代表 -00030 到 +00030?
不过,可以进行三个修复:
1) 使用 float 来表示整数度数。 Float确实有负零的概念,但不能简单地与< 0比较来检测它;
2) 使用 -360,因为技术上等于 -0 度。但这可能会破坏您正在调用的代码。如果您沿着这条路走下去,您还可以使用 +360 来表示“正”零,并仅在该值精确到最后一个小数时为 0 时保留 0;
3) 将整个 DDDMMMMMM 转换为实数(可能是 double ),将 MMMMM 表示为小数。这样标志就很容易保存。
关于c - 将 0 表示为 gnss 坐标的负数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56899568/