2012-11-02 70 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