2015-07-20 100 views
1

我有一個C#函數,它將整數正數或負數舍入到十。例如:19 - > 10; 11 - > 10; 99 - > 90; -11 - > -20; -19 - > -20。 代碼:向下舍入整數值

public int RoundDownTo10(int value) 
{ 
    if ((value < 0) && ((value % 10.0) != 0)) 
    { 
     return (((int)Math.Truncate(value/10.0)) - 1) * 10; 
    } 
    else 
    { 
     return ((int)Math.Truncate(value/10.0)) * 10; 
    } 
} 

我需要幫助,使可本輪下跌在參數列表中給出的任何數量的功能。例如: RoundDownToNumber(int value, int roundDownToNumber) {...}

RoundDownToNumber(50, 30) -> 30; 
RoundDownToNumber(20, 30) -> 0; 
RoundDownToNumber(-1, 30) -> -30; 
RoundDownToNumber(-51, 50) -> -100; 
RoundDownToNumber(149, 50) -> 100; 

謝謝。

+0

你究竟想要什麼?您的要求與第二個代碼 –

+0

中給出的方法不匹配您是否可以簡單地將正值「值」減去「值%10」,對「負值」值減去「值%10 + 10」? – Lynn

+2

四捨五入到10,代碼使用值「10.0」和「10」四次......你有沒有嘗試過任何東西? – Orace

回答

5

在這裏你去:

public static int RoundDownToNumber(int value, int modulus) 
{ 
    if (value < 0) 
     return modulus*((value-modulus+1)/modulus); 
    else 
     return modulus*(value/modulus); 
} 

這爲所有例如輸入所需的輸出。

+0

不錯的一個。請檢查我的單行。 –

1

你已經做出整體工作,只轉10 roundDownToNumber:

public int RoundDownToNumber(int value, int roundDownToNumber) 
    { 
     if ((value < 0) && ((value % roundDownToNumber) != 0)) 
     { 
      return (((int)Math.Truncate((double)value/roundDownToNumber)) - 1) * roundDownToNumber; 
     } 
     else 
     { 
      return ((int)Math.Truncate((double)value/roundDownToNumber)) * roundDownToNumber; 
     } 
    } 
3

% 10運營商將分離出來的最後一個數字和它的符號,可以這麼說:34 % 10 == 4-34 % 10 == -4。對於正數34,我們要去從3430,所以我們從它減去最後一個數字:

if (value >= 0) 
    return value - value % 10; 

對於負數-34,我們想去-40。我們可以減去模給我們的-4達到-30,然後減去10更多,達到-40

else 
    return value - value % 10 - 10; 

現在用一個變量替換10,就大功告成了。

+1

這是做到這一點的方法。精度問題沒有浮點值。沒有昂貴的分工/乘法與不確定性結果。 – Orace

+1

@Orace你認爲'%'操作符在其實現中沒有劃分嗎? –

+0

嗯,它沒有*浮點*部門,這是我認爲@Orace擔心的。 – Lynn

-1

這應該工作

public int RoundDownToValue(int value,int RoundTo) 
{ 
if(value!=0 && RoundTo !=0) 
    { 
    int x = (((int)(value/RoundTo))); 
    if ((value > 0)) 
    {  
    return (x*RoundTo); 
    } 
    else 
    { 
    return (x*RoundTo)+(RoundTo*(-1)); 
    }  
} 
} 
1
public int RoundDownToNumber(int value, int roundToNumber) { 
    return value - ((roundToNumber + (value % roundToNumber)) % roundToNumber); 
} 

解釋:我們必須從價值減去不必要的盈餘。所以我們必須確定不必要的盈餘數量。爲了不必處理單獨的案例,我們將roundToNumber添加到模,確保我們得到一個正值,然後我們再次模,確保我們得到確切需要的值。這是一種單線,類似配方的解決方案。