我有一个函数,用于返回gnss坐标的度和分钟作为DDDMMMMMMM。
要提取度数部分,我将整数除法为DDDMMMMMMM /(10 ^ 7)。
但是问题是,如果DDD为0,我会丢失符号。
如何保留DDD的符号,以便使用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;
}
客户端然后只需检查一下度Obj.isNegative是否为真
答案 0 :(得分:1)
我看不到可以使用整数完成所需操作的方法。您不能简单地将值的度数部分用作带符号的零整数。
正如其他人所说,很难理解为什么你会关心。如果您不关心值09059 ...接近091,那么为什么要关心-00010 ...与+00010 ...是否不同?也许您真正需要做的是将值四舍五入到最接近的整数,然后000度代表-00030到+00030?
不过,可以修复三个问题:
1)使用浮点数表示整数度。浮点数确实具有负零的概念,但是您不能简单地与<0进行比较以检测到它;
2)使用-360,因为技术上等于-0度。但这可能会破坏您正在调用的代码。如果沿着这条路走,您还可以使用+360代表“正”零,并保持0(仅当该值正好为0至最后一个小数);
3)将整个DDDMMMMMM转换为将MMMMM表示为小数的实数(可能是双精度数)。这样,标志就很容易保存。
答案 1 :(得分:0)
简单地说:由于带符号的整数表示形式可能是1或2的补码,所以您不能在C中可靠地使用负零整数。 由于二进制补码没有负零并且是主要的,也可能是将来C标准的强制表示形式,因此整数不是您在C中的选择。
因此,我建议您务实使用浮点类型,例如let attachments = JSON.parse(pm.environment.get('attachments'));
pm.test('All attachments are of correct value', function () {
// ...write your test here using the `attachments` variable
});
,通常应适合您的情况。
答案 2 :(得分:0)
我们假设负值:
-DDDMMMMMMM
它可以被重写:
(-DDD) + (-MMMMMMM)
可以通过以下方式计算:
(-DDDMMMMMMM / 10) + (-DDDMMMMMMM % 10)
其中%是C语言中modulo
的运算符。
因此,如果
DDD = 0
您仍然会有
-MMMMMMM
仍然为负。
总的来说,我认为您不必担心正零和负零。标志仍然在某处。
正如已经指出的那样,为了完全具有所需的符号,应保存符号,使用-DDDMMMMMMM的绝对值进行除法,然后根据需要再次应用符号。