将数字列表四舍五入到用户定义的步骤,同时保留它们的总和

时间:2011-07-23 13:59:40

标签: objective-c c floating-point integer rounding

我一直在阅读很多关于数字四舍五入的帖子,但我无法做到我想做的事情:

我有一张正浮标列表。 要使用的无符号整数 roundOffStep 是用户定义的。我无法控制其他。

我希望能够在保留这些数字的总和的同时进行最精确的舍入,或者至少在保持新总和低于原始总和的同时。

我该怎么做?我对算法很糟糕,所以这对我来说太棘手了。

THX。

编辑:添加测试用例:

FLOATS
   29.20
   18.25
   14.60
   8.76
   2.19

sum = 73;

让我们说roundOffStep = 5;

ROUNDED FLOATS
30
15
15
10
0

sum = 70< 73好的

1 个答案:

答案 0 :(得分:1)

  1. 通常将所有数字舍入到roundOffStep的最接近的倍数。
  2. 如果新金额低于原始金额,那就完成了。
  3. 对于每个号码,请计算rounded_number - original_number。按递减顺序对差异列表进行排序,以便找到差异最大的数字。
  4. 选择产生最大差异rounded_number - original_number的数字,然后从该数字中减去roundOffStep
  5. 重复步骤4(每次选择下一个最大差异),直到新总和小于原始值。
  6. 此过程应确保舍入的数字尽可能接近原始数字,而不会超过原始总和。

    示例,roundOffStep = 5

        Original Numbers  |   Rounded  |  Difference
    ----------------------+------------+--------------
             29.20        |     30     |     0.80
             18.25        |     20     |     1.75
             14.60        |     15     |     0.40
             8.76         |     10     |     1.24
             2.19         |     0      |    -2.19
    ----------------------+------------+--------------
    Sum:     73           |     75     |
    

    总和太大,所以我们选择给出最大差异的数字(18.25舍入为20)并减去5得到15.现在总和是70,所以我们已经完成了。