【问题标题】:Type casting not working properly (arduino IDE)类型转换无法正常工作(arduino IDE)
【发布时间】:2015-04-07 21:26:29
【问题描述】:

大家好,我有一个全球定位系统,我通过图书馆获取经度和纬度。我想要 4 个十进制数字,所以我想将近 20 个十进制数字长数字转换为 4 个小数,所以我将坐标发送到一个函数中,如下所示。我在每一步都进行了调试,我发现与类型转换不一致。你能告诉我为什么我得到那个输出吗?我的意思是我用十进制数字除以全零,我得到了一些不寻常的东西,正如你在 final 变量中看到的那样,这太荒谬了。

float conv_4digits(float coordinate){

  Serial.print("coordinate ");Serial.println(coordinate,30);

  float final;
  float var1;
  var1 = (int)coordinate;
  Serial.print("var1 "); Serial.println(var1,30);
  float var2 = coordinate - var1;
  Serial.print("var2 "); Serial.println(var2,30);
  var2 = var2 * 10000;
  Serial.print("var2 "); Serial.println(var2,30);
  float var3 = (int)var2;
  Serial.print("var3 "); Serial.println(var3,30);
  float var4 = var3 / 10000;
  Serial.print("var4 "); Serial.println(var4,30);
  final = var1 + var4;
  Serial.println(final, 10);

  return final;
}

输出

coordinate 34.684024810791015625000000000000
var1 34.000000000000000000000000000000
var2 0.684024810791015625000000000000
var2 6840.248046875000000000000000000000
var3 6840.000000000000000000000000000000
var4 0.684000015258789062500000000000
34.6839981079

有什么线索吗?我尝试在我得到十六进制数字的情况下键入强制转换整数。

有没有更好的方法以 4 位十进制数字输出经度和纬度并将其存储在变量中?因为我想制作 if 语句并将它们与一些固定的经度和纬度与 4 个十进制数字进行比较。

【问题讨论】:

  • 在 C 中使用 printf() 格式说明符:printf("%.4f", 34.68402481);

标签: c# c gps ide arduino


【解决方案1】:

您不能只将浮点数四舍五入到任意数量的十进制数字,然后希望浮点数之间的相等比较能够起作用。浮点相等比较不起作用,这是一个众所周知的问题,例如见What's wrong with using == to compare floats in Java?

归结为不能检查X是否等于Y,(如果X和Y是浮点数)你只能检查X是否大致等于Y。

这意味着您需要执行 if Y + e >= X && X >= Y - e 而不是 X == Y,其中 e 是一些非常小的但正值。

因此,由于您将进行范围比较,因此您无需担心舍入。忘记四舍五入。

【讨论】:

  • 谢谢你的问题是我没有把4位小数的变量看作是一个浮点数,后面有0来对应实时值的小数位范围。
猜你喜欢
  • 2013-09-07
  • 2016-12-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-22
  • 2013-11-20
  • 2013-01-24
  • 2015-10-09
相关资源
最近更新 更多