【发布时间】:2010-07-19 23:29:31
【问题描述】:
如何将数字四舍五入到最接近的 X 值(例如 50)
即 47 等于 50
24 将是 0
74 等于 50
99 将是 100
等等……
我真的不知道从哪里开始研究如何做到这一点......
附言我在 iPhone 上使用 cocoa-touch
非常感谢 标记
【问题讨论】:
标签: iphone objective-c math
如何将数字四舍五入到最接近的 X 值(例如 50)
即 47 等于 50
24 将是 0
74 等于 50
99 将是 100
等等……
我真的不知道从哪里开始研究如何做到这一点......
附言我在 iPhone 上使用 cocoa-touch
非常感谢 标记
【问题讨论】:
标签: iphone objective-c math
这样做:
50.0 * floor((Number/50.0)+0.5)
【讨论】:
除以 50,四舍五入到最接近的整数,然后乘以 50。
【讨论】:
所以,结合这里所说的,这里是一般功能:
float RoundTo(float number, float to)
{
if (number >= 0) {
return to * floorf(number / to + 0.5f);
}
else {
return to * ceilf(number / to - 0.5f);
}
}
【讨论】:
如果数字是正数: 50 * 楼层(数字 / 50 + 0.5);
如果数字是负数: 50 * ceil ( 数字 / 50 - 0.5 );
【讨论】:
我想提出一个不太优雅但更精确的解决方案;它仅适用于偶数目标数字。
此示例将给定的秒数舍入到下一个完整的 60:
int roundSeconds(int inDuration) {
const int k_TargetValue = 60;
const int k_HalfTargetValue = k_TargetValue / 2;
int l_Seconds = round(inDuration); // [MININT .. MAXINT]
int l_RemainingSeconds = l_Seconds % k_TargetValue; // [-0:59 .. +0:59]
if (ABS(l_RemainingSeconds) < k_HalfTargetValue) { // [-0:29 .. +0:29]
l_Seconds -= l_RemainingSeconds; // --> round down
} else if (l_RemainingSeconds < 0) { // [-0:59 .. -0:30]
l_Seconds -= (k_TargetValue - ABS(l_RemainingSeconds)); // --> round down
} else { // [+0:30 .. +0:59]
l_Seconds += (k_TargetValue - l_RemainingSeconds); // --> round up
}
return l_Seconds;
}
【讨论】: