类型转换无法正常工作(arduino IDE)
Type casting not working properly (arduino IDE)
大家好,我有一个全球定位系统,我通过图书馆获取经度和纬度。我想要 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 个十进制数字。
您不能只将浮点数四舍五入为任意小数位数,然后希望浮点数之间的相等比较起作用。浮动相等比较不起作用,这是一个众所周知的问题,例如参见 [=12=]
归结起来就是你不能检查X是否等于Y,(如果X和Y是浮点数,)你只能检查X是否大致等于Y。
这意味着您需要执行 if Y + e >= X && X >= Y - e
而不是 X == Y
,其中 e 是一个非常小但为正的值。
因此,由于您要进行范围比较,因此无需担心舍入问题。忘记四舍五入。
大家好,我有一个全球定位系统,我通过图书馆获取经度和纬度。我想要 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 个十进制数字。
您不能只将浮点数四舍五入为任意小数位数,然后希望浮点数之间的相等比较起作用。浮动相等比较不起作用,这是一个众所周知的问题,例如参见 [=12=]
归结起来就是你不能检查X是否等于Y,(如果X和Y是浮点数,)你只能检查X是否大致等于Y。
这意味着您需要执行 if Y + e >= X && X >= Y - e
而不是 X == Y
,其中 e 是一个非常小但为正的值。
因此,由于您要进行范围比较,因此无需担心舍入问题。忘记四舍五入。