c - sprintf 似乎正在四舍五入?

标签 c printf

下面我的 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.31500000speed_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/

相关文章:

c - 当我尝试运行它时,程序崩溃了,我不知道为什么

C - fgets 如何处理多个调用

ios - 如何在 Xcode 管理器中访问设备日志(不是崩溃报告)

c - C如何在printf语句中编译 "senthil"“kumar”?

c - 在 C 中使用指针反转任意长度的字符串

c++ - 该程序是否在所有标准系统上显示四套牌(♠♣♥♦)?

c - 如何使用 atmega 退出 USART ISR?

c++ - 用 printf 打印一个字符

java - java中的缩进打印

c - C中的'\0'和printf()