是否可以在 c 中舍入数字的最后 3 位数字?

is it possible to round the last 3 digits of a number in c?

我想舍入浮点数的最后 3 位 169786.122 只留下 3 位

是否可以使用 math.h 库和 ceil 函数来实现?

如果 169786.122 == 170

如果 169121.122 == 169

如果 171126.122 == 171

如果 179911.122 == 180

..等等

float aNum = 169726.122;

int main() {

    printf("%.0f\n",aNum); // result 169726
    return 0;
}

如果:

  • 通过选择 1000 的偶数倍来打破平局是令人满意的,
  • 所需的 1000 倍数可以用 float 格式表示,并且
  • float 格式使用基数二或十,

然后(x - remainderf(x, 1000)) / 1000计算出想要的结果。

这是有效的,因为 remainderf 函数总是产生精确的结果(没有舍入误差),并且如果所需的 1000 倍数是可表示的,则减法会产生该倍数而没有舍入误差。如果 floating-point 格式使用十进制,除法只是改变指数,没有舍入误差。如果格式以二为底,125的倍数除以125乘以2的幂不能增加有效位数,所以结果必须在有效位数内,所以没有舍入误差。

这些警告并不严格;我希望可以进行各种改进。特别是,如果使用 nearbyint((x - remainderf(x, 1000)) / 1000),使用 IEEE-754“单精度”格式 (binary32),它会在所有可表示所需结果的情况下获得正确的结果。