在C中创建一个广义舍入函数

时间:2017-12-31 09:35:17

标签: c rounding

关于Stack Overflow的大多数舍入问题都是关于特定情况的,因为我刚刚做了一个通用的舍入函数,我想我会分享它。

我有一个 f 的数字,一个起始值 a ,一个增量 b ,我想“圆” f 到集合{ a + b i |中最近的元素 i 是一个整数}。例如:

  • a = 0.0b = 0.5:舍入为其中一个值0.00.5,{{ 1}},1.0

  • 1.5 = a0.25 = b:舍入为其中一个值0.50.25,{{ 1}},0.75

  • 1.25 = 1.75a = 0.21:舍入为其中一个值b0.23,{{ 1}},0.21

标准C库有roundf()但它只舍入到最接近的整数。

我该怎么做?

1 个答案:

答案 0 :(得分:1)

0.44

输出:

0.67

第一个例子:0.80

第二个例子:#include <stdio.h> #include <math.h> float round_float(float x, float inc, float start_val) { return ( roundf( (x - start_val) / inc ) * inc + start_val ); } int main(void) { printf("%f\n", round_float(12.522, 0.5, 0)); printf("%f\n", round_float(12.522, -0.5, -0.1)); printf("%f\n", round_float(5.318, 0.23, 125)); printf("%f\n", round_float(-12.522, 12, 5)); printf("%f\n", round_float(-12.522, 3.6, -2)); }

最后一个例子:12.500000 12.400000 5.400002 -7.000000 -12.799999

扩展示例

此代码显示随机样本值如何四舍五入到由起始值和增量指定的三个序列中的每一个中最近的条目 - 使用问题中列出的值。

round_float(10.1521, 0.5, 0)

示例输出:

round_float(10.1521, 0.5, 0.25)

我确信更明智地选择样本值会使得这一点更加明确;这些只是-20 .. +20范围内的随机数的集合,按排序顺序。

在最后一个例子中为额外的缩进级别道歉。 当预览没有缩进两个级别时,预览没有显示“代码”,我不知道为什么。 (配置:Firefox Quantum 57.0.1(重启待定)在macOS High Sierra 10.13.2和SO 2017.12.22.28257上)