雖然 - 正如別人提到的那樣 - 積分的行爲就像你期望的那樣,可能是以下解決方案看起來「不那麼有線」(仍然基於觀點)。
關於一種轉換INT爲雙重的解決方案:我個人覺得這是昂貴的只是四捨五入的原因,但也許有人能說服我,我的感覺是錯誤的;
不管怎樣,僅僅通過使用積分算,以下解決方案使上是否double
的尾數總能保持每int
多餘的討論:
int RoundToMultiple(int toRound, int multiple) {
toRound += multiple/2;
return toRound - (toRound%multiple);
}
如果您還希望包括負值,代碼(包括測試):
#include <stdio.h>
int RoundToMultiple(int toRound, int multiple) {
toRound += toRound < 0 ? -multiple/2 : multiple/2;
return toRound - (toRound%multiple);
}
int main(int argc, char const *argv[])
{
int tests[] = { 36,99,123,164,-36,-99,-123,-164,0 };
int expectedResults[] = { 0,100,100,200,0,-100,-100,-200,0 };
int i=0;
int test=0, result=0, expectedResult=0;
do {
test = tests[i];
result = RoundToMultiple(test, 100);
expectedResult = expectedResults[i];
printf("test %d: %d==%d ? %s\n", test, result, expectedResult, (expectedResult==result ? "OK" : "NOK!"));
i++;
}
while(test != 0);
}
這可能不適用於負數。 – Gerriet
@Gerriet好點,雖然在我的情況下,數字也可以假設爲正數。我將它添加到問題 –
您想要RoundToMultiple(150,100)表現如何?它應該返回100還是200?換句話說,整理,整理或使用銀行家的舍入規則? –