C语言截断数字:无浮点数提取末尾三位数值的方法问询
解决获取十进制末尾三位的问题
你之前用位运算number_decimal = 123456 & 0x07出错的原因很直接:0x07是二进制111,只能截取二进制的最后三位(对应十进制0-7),但你需要的是十进制的末尾三位,这两者完全不是一回事——因为1000不是2的整数次幂,没法用简单的位掩码实现。
正确实现方式
直接用取模运算符%计算原数除以1000的余数,这就是十进制末尾三位的数值:
unsigned long num = 123456; unsigned long number_integer = num / 1000; // 得到123 unsigned int number_decimal = num % 1000; // 得到456
结合sprintf输出的完整示例
要保证小数部分始终是三位(比如原数是1234时,要输出1.234而不是1.23),可以在sprintf格式串里用%03u补前导零:
char output_buf[32]; sprintf(output_buf, "%lu.%03u", number_integer, number_decimal); // 之后将output_buf通过UART发送即可
补充说明
位运算仅适用于除数是2的整数次幂的场景(比如取二进制最后4位用& 0xF,对应十进制除以16取余)。对于十进制位数截取,因为10不是2的幂,必须用除法和取模运算来实现。
内容的提问来源于stack exchange,提问作者Gunn
相关产品推荐
相关产品推荐

