下面我的 C 代码中发生了一些奇怪的事情。
我想比较数字,我四舍五入到小数点后 4 位。
我已经调试过了,可以看到传入的数据。
tmp_ptr->current_longitude
的值为6722.31500000,tmp_ptr->current_latitude
的值为930.0876500000。
使用 sprintf 语句后:
charTmpPtrXPos = "6722.3150" and charTmpPtrYPos = "930.0876".
我希望 speed_info->myXPos 和 speed_info->myYPos 的结果完全相同,但奇怪的是即使 speed_info->myXPos = 6722.31500000
和 speed_info->myYPos > = 30.0876500000 的值
,sprintf 语句
charSpeedPtrYPos= "930.0877"
所以基本上 sprintf 语句对第二个值的行为有所不同,并且似乎将其四舍五入。调试后,我知道 sprintf 语句的输入完全相同。
有人能想出其中的原因吗?
sizeOfSpeedList = op_prg_list_size (global_speed_trajectory);
tmp_ptr= (WsqT_Location_Message*)op_prg_mem_alloc(sizeof(WsqT_Location_Message));
tmp_ptr = mbls_convert_lat_long_to_xy (own_node_objid);
sprintf(charTmpPtrXPos, "%0.4lf", tmp_ptr->current_longitude);
sprintf(charTmpPtrYPos, "%0.4lf", tmp_ptr->current_latitude);
speed_info = (SpeedInformation *) op_prg_mem_alloc (sizeof (SpeedInformation));
for (count=0; count<sizeOfSpeedList; count++)
{
speed_info = (SpeedInformation*) op_prg_list_access (global_speed_trajectory, count);
sprintf(charSpeedPtrXPos, "%0.4lf", speed_info->myXPos);
sprintf(charSpeedPtrYPos, "%0.4lf", speed_info->myYPos);
//if((tmp_ptr->current_longitude == speed_info->myXPos) && (tmp_ptr->current_latitude == speed_info->myYPos))
if ((strcmp(charTmpPtrXPos, charSpeedPtrXPos) == 0) && (strcmp(charTmpPtrYPos, charSpeedPtrYPos) == 0))
{
my_speed = speed_info->speed;
break;
}
}
最佳答案
printf()
通常四舍五入到最接近的十进制表示,并发送到“偶数”(即最后一位数字为 0、2、4、6 或 8 的表示) ).
但是,您必须了解,大多数可以用十进制有限表示的数字不能用二进制 float 有限表示。例如,实数 930.08765
不能表示为二进制 float 。您真正拥有的 double
值(以及转换为十进制的值)是另一个数字,可能略高于 930.08765
,很可能 930.0876500000000532963895238935947418212890625
.此数字四舍五入为十进制表示 930.0877
是正常的,因为它更接近此表示而不是 930.0876
。
请注意,如果您使用的是 Visual Studio,您的 *printf() 函数可能仅限于显示 17 位有效数字,从而阻止您观察 double
最近的 930.08765< 的准确值
.
关于c - sprintf 似乎正在四舍五入?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18148090/