四舍五入到间隔不均匀的整数

Rounding to whole numbers unevenly spaced apart

本文关键字:整数 不均匀 四舍五入      更新时间:2023-10-16

我正在编写一个函数来帮助我进行力量训练。该程序根据我需要举起的百分比生成特定的重量。与其给我227.44,我希望它四舍五入到最接近的值,我有确切的重量放在我的横杆上,应该是225。我已经编写了一个有效的函数,但我知道必须有一个更快/更好的方法。我是一名CS学生,当我得到更小的盘子来锻炼时,我也会修改这个代码。如何以更好的方式实现这一点:

int getPercentage(double percent, double max){
int finalValue = max*percent;
if(finalValue < 45) return 45;
else if(finalValue >= 45 && finalValue < 55) return 45;
else if(finalValue >= 55 && finalValue < 65) return 65;
else if(finalValue >= 65 && finalValue < 80) return 65;
else if(finalValue >= 80 && finalValue < 95) return 95;
else if(finalValue >= 95 && finalValue < 105) return 95;
else if(finalValue >= 105 && finalValue < 115) return 115;
else if(finalValue >= 115 && finalValue < 125) return 115;
else if(finalValue >= 125 && finalValue < 135) return 135;
else if(finalValue >= 135 && finalValue < 145) return 135;
else if(finalValue >= 145 && finalValue < 155) return 155;
else if(finalValue >= 155 && finalValue < 170) return 155;
else if(finalValue >= 170 && finalValue < 185) return 185;
else if(finalValue >= 185 && finalValue < 195) return 185;
else if(finalValue >= 195 && finalValue < 205) return 205;
else if(finalValue >= 205 && finalValue < 215) return 205;
else if(finalValue >= 215 && finalValue < 225) return 225;
else if(finalValue >= 225 && finalValue < 235) return 225;
else if(finalValue >= 235 && finalValue < 245) return 245;
else if(finalValue >= 245 && finalValue < 260) return 245;
else return 275;
}

嗯。。。

int getPercentage(double percent, double max){
int finalValue = max*percent;
if(finalValue > 260) return 275;
else if(finalValue >= 235) return 245;
else if(finalValue >= 215) return 225;
else if(finalValue >= 170) return 185;
else if(finalValue >= 145) return 155;
else if(finalValue >= 125) return 135;
else if(finalValue >= 105) return 115;
else if(finalValue >= 80) return 95;
else if(finalValue >= 55) return 65;
else return 45
}

这肯定是一个开始。

解释:

我做了一些简化。

1) 要测试的单个范围。当你有两个相邻的数字范围要测试,并且在任何一个范围内着陆都会得到相同的结果时,你可以将它们组合成一个。有两个范围的唯一真正原因是,如果你正在用它们做两件不同的事情,而你不在给定的样本中。

2) 从最高到最低。

我做的第二件事是重新安排你的测试从最高到最低。这就利用了else-if功能,无需测试天花板。记住:Else-if取第一个真条件,执行它的块并抛出其余的。因此,如果执行到达下一个Else-if,可以放心地假设这个数字没有超过我们的上限,因为我们的上限紧挨着前一层。因此,我们可以测试底层,使代码更具可读性。

注意:我们本可以很容易地从最低到最高编写类似的函数,但我选择这种方式是因为它对我来说更容易。

最后但同样重要的是,

3) 删除了对低于45和55 的测试

这也属于数字1,因为0-45和46-55也是相邻的两个范围,但我单独提到它们还有另一个原因:它们的包含是不必要的。正如在#2中所讨论的,如果达到了其他值,可以放心地假设这个数字小于我们的上限:55。再说一遍,我们只需要检查地板。由于我们这次没有楼层(尽管我们稍后可以增加一个),我们没有什么可检查的。因此,我们不需要else if,只需要else。