是否可以在 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),它会在所有可表示所需结果的情况下获得正确的结果。
我想舍入浮点数的最后 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),它会在所有可表示所需结果的情况下获得正确的结果。