2013-03-01 97 views
25

我想弄清楚如何整理價格 - 兩種方式。例如:將整數舍入到10的最接近倍數

Round down 
43 becomes 40 
143 becomes 140 
1433 becomes 1430 

Round up 
43 becomes 50 
143 becomes 150 
1433 becomes 1440 

我有,我有發言權的一個價格區間的情況:

£143 - £193 

其中我想顯示爲:

£140 - £200 

,因爲它看起來很多清潔劑

關於我如何實現這一點的任何想法?

+0

我試圖Math.Floor – dhardy 2013-03-01 09:32:09

+0

地板是地板爲雙打。 – evanmcdonnal 2013-03-01 09:33:00

+0

除以10,round,乘以10 – 2013-03-01 09:33:09

回答

48

我只想創建一對方法;

int RoundUp(int toRound) 
{ 
    if (toRound % 10 == 0) return toRound; 
    return (10 - toRound % 10) + toRound; 
} 

int RoundDown(int toRound) 
{ 
    return toRound - toRound % 10; 
} 

模給我們的餘數,在圍捕的情況下10 - r帶你到最近的十分之一,向下舍你只減河非常直截了當。

+10

「RoundUp」壞了。如果你通過'20',它會變成'30',這很可能不是你想要的。您可以執行條件測試('if((toRound%10)== 0)return toRound;')或使用無條件舍入,例如'return((toRound + 9)/ 10)* 10;' – DarkDust 2013-12-10 09:00:49

+3

上面的邏輯只適用於正數(正如我剛剛發現的)。 – Knightsy 2013-12-12 14:01:48

+2

如果您在價格計算或其他方面的任何地方都有負數,則更改爲'Math.Abs​​(toRound)%10'。 – Knightsy 2013-12-12 14:09:25

4

除以10.

number = number/10; 
Math.Ceiling(number);//round up 
Math.Round(number);//round down 

然後乘以數目除以10

number = number * 10; 
+0

根據規格給出1433的錯誤答案 – 2013-03-01 10:18:52

10

此代碼舍入到10個最接近的倍數:

int RoundNum(int num) 
{ 
    int rem = num % 10; 
    return rem >= 5 ? (num - rem + 10) : (num - rem); 
} 

很簡單的用法:

Console.WriteLine(RoundNum(143)); // prints 140 
Console.WriteLine(RoundNum(193)); // prints 190 
+0

根據規格給出1433的錯誤答案。 – 2013-03-01 10:16:44

12

你並不需要使用模數(%)或浮點...

這工作:

public static int RoundUp(int value) 
{ 
    return 10*((value + 9)/10); 
} 

public static int RoundDown(int value) 
{ 
    return 10*(value/10); 
} 
+0

可能不會給你想要的大數字(例如Int32.MaxValue) – Joe 2013-03-01 10:19:50

+1

是的,RoundUp將失敗高於(int32.MaxValue-10)的數字。儘管如此,不要認爲這是以磅爲單位的問題。無論如何,無論如何都不可能將這些數字捨去(除非你返回一長串)。 – 2013-03-01 13:28:23

+1

這對我來說很好,我喜歡它不使用模量。等效在Go: FUNC ROUNDUP(V INT)INT { \t返回10 *((V + 9)/ 10) } FUNC ROUNDDOWN(V INT)INT { \t返回10 *(V/10) } – fiorix 2015-12-04 19:17:38

2

的一般方法把一個數字到另一個數的倍數,舍入away from zero

對於整數

int RoundNum(int num, int step) 
{ 
    if (num >= 0) 
     return ((num + (step/2))/step) * step; 
    else 
     return ((num - (step/2))/step) * step; 
} 

對於float

float RoundNum(float num, float step) 
{ 
    if (num >= 0) 
     return floor((num + step/2)/step) * step; 
    else 
     return ceil((num - step/2)/step) * step; 
} 

我知道有些部分可能似乎違反直覺的或者不是很優化。我試着將(num + step/2)投射到一個int,但是這給了負浮點數的錯誤結果((int) -12.0000 = -11等)。反正這些是我測試少數情況下:

  • 任何數量舍入到步驟1應該是本身
  • -3四捨五入到步驟2 = -4
  • -2四捨五入到步驟2 = -2
  • 3四捨五入至步驟2 = 4
  • 2四捨五入至步驟2 = 2
  • -2.3四捨五入至步驟0.2 = -2。4
  • -2.4四捨五入到步驟0.2 = -2.4
  • 2.3四捨五入到步驟0.2 = 2.4
  • 2.4四捨五入到步驟0.2 = 2.4
相關問題