2014-02-06 54 views
1

我想根據第三個小數點來取整值。它應該始終採用UP值並四捨五入。我使用了Math.Round,但它並沒有像我期望的那樣產生結果。總是舍入一個C#值

方案1

var value1 = 2.526; 
var result1 = Math.Round(value1, 2); //Expected: 2.53 //Actual: 2.53 

方案2

var value2 = 2.524; 
var result2 = Math.Round(value2, 2); //Expected: 2.53 //Actual: 2.52 

方案1是確定。它正在產生我期望的結果。 在第二種情況下,我的金額爲2.522。我想考慮第三個小數點(在這種情況下是'4'),它應該四捨五入。預期結果是2.53

無論第三個小數點是什麼(無論小於5還是大於5),都應該總是向上舍入。

任何人都可以爲我提供解決方案嗎?我不認爲Math.Round在這裏幫助我。

+2

如果你對小數點感興趣,也許你應該使用'decimal'而不是'double'?你想表達什麼樣的價值? –

+2

「,但它並沒有像我預期的那樣產生結果。」 - 說實話,「總是向上」並不是許多人期望的結果。 –

+0

另外值得指出的是,Math.Round通常會被誤解: http://stackoverflow.com/questions/977796/why-does-math-round2-5-return-2-instead-of-3-in-c – Jordan

回答

4
var value2 = 2.524; 
var result2 = Math.Round(value2, 2); //Expected: 2.53 //Actual: 2.52 
if(result2 < value2) 
    result += 0.01; // actual 2.53 
+0

根據我所問的問題,這是正確的(將小數點後第三位進行比較)。 –

0

這個怎麼樣:

Math.Round(Value+0.005,2) 
+0

請注意,您需要在執行此操作時強制進行中點向下舍入,否則0.000可能會向上*;並沒有「down」'MidpointRounding'模式... –

+3

@SonerGönül這是一個很常見的伎倆;天花板版本更好,雖然 –

+0

看起來像四捨五入到2dp,並且如果3rd dp> 0總是舍入第三個dp。雖然那可能應該是Value + 0.005-EPSILON? O.o. –

6

正如喬恩說,使用小數代替。然後你可以做到這一點總是有2個小數點。

Math.Ceiling(value2 * 100)/100 
2

最後我想出了一個解決方案。我改進了Sinatr的答案如下,

var value = 2.524; 
var result = RoundUpValue(value, 2); // Answer is 2.53 

public double RoundUpValue(double value, int decimalpoint) 
{ 
    var result = Math.Round(value, decimalpoint); 
    if (result < value) 
    { 
     result += Math.Pow(10, -decimalpoint); 
    } 
    return result; 
}