2012-11-02 110 views
0
string input = Console.ReadLine(); 
decimal sum = Convert.ToDecimal(input); 
if (sum >= (decimal)500.01) 
{ 
    //40% and 8 dollars off shipping costs are taken off total amount 
    decimal totalprice; 
    totalprice = (sum - 8) * .60m; 
    Math.Truncate(totalprice); 
    Console.WriteLine("Your final cost is:${0:0.00}", totalprice); 
    Console.Read(); 

問題是,當我在我的程序中輸入價格598.88美元時,我應該得到354.52。截斷在C#

數學運算:

598.88 - 8 = 590.88. 590.88 * 60% = 354.528 

我真正得到354.53因爲C#,而不是向下取整的了。 例如,

如果我收到類似519.998的答案,我希望它保持在519.99。 另一個例子,如果我得到像930.755這樣的答案,我希望它留在930.75

我看了一些答案,但Math.Truncate顯然不適用於我,並使用*100/100技巧也無法正常工作。請記住,我是一名新生,因此,如果答案可能是安全的,那就太好了。謝謝。

+3

'Math.Floor()'.. – zerkms

+1

像zerkms說使用Math.Floor() ,還可以使用Decimal.TryParse來確保輸入正確。 – user1534664

+0

'Math.Truncate()'顯然不適合你,因爲它對它的參數沒有任何作用,它返回結果。 – svick

回答

1

* 100/100工作正常,您可能會錯誤地使用它。試試這個如下:

decimal totalprice = TruncateToTwoDigits((sum - 8) * .60m); 
Console.WriteLine("Your final cost is:${0:0.00}", totalprice); 

... 

private static decimal TruncateToTwoDigits(decimal Value) 
{ 
    int adjusted = (int)Math.Truncate(Value * 100m); 
    return adjusted/100m; 
} 

作爲一個側面說明,Math.Truncate返回截斷值,它不會改變,因爲你的代碼將意味着輸入參數。

+0

哇,工作,並不太難理解,但在我的一個很好的水平。感謝您的幫助。 – Sarah

1

與所有其他數學函數一樣,Math.Truncate返回函數調用後的值。該函數不會改變你的變量。實際上這對雙打是不可能的(請參閱參考參數)。所以,你需要做的:

totalprice = Math.Truncate(totalprice); 

請注意,所以如果該值是45.985,結果是45,所以你需要通過100相乘,然後除以totalprice將剛纔的整數部分。 http://msdn.microsoft.com/en-us/library/7d101hyf.aspx

你到達那裏的向上取整是因爲console.Write調用String.Format來做到這一點。請參閱http://www.csharp-examples.net/string-format-double/以獲得您的寫入函數調用。

+0

等一下,我想代碼就像「this.Close();」被稱爲一種方法,它是一個動詞。哦。然後你從主權利中做出一個方法/功能?我需要學習很多:< – Sarah

0

Modulo也可以。 (這是很難說這是安全性,可讀性和更好的性能。)

Decimal totalprice = (sum - 8m) * 0.60m; // Discount $8.00 and then 40%. 
totalprice -= totalprice % 0.01; // Truncate to two decimal places. 

在類似問題Truncate Two decimal places without rounding