在C#中截断

时间:2012-11-02 00:43:22

标签: c# math

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。

数学:

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 个答案:

答案 0 :(得分:2)

* 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返回截断的值,它不会像您的代码所暗示的那样更改输入参数。

答案 1 :(得分:2)

Math.Truncate像所有其他Math函数一样,在调用函数后返回值。该函数不会改变您的变量。实际上双打是不可能的(请参阅参数参数)。所以你需要这样做:

totalprice = Math.Truncate(totalprice);

请注意,totalprice只有整数部分,所以如果值是45.985,结果是45,所以你需要乘以100然后除。 http://msdn.microsoft.com/en-us/library/7d101hyf.aspx

你到达那里的四舍五入是因为console.Write会调用String.Format。请参阅http://www.csharp-examples.net/string-format-double/以获取写函数调用。

答案 2 :(得分: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

处的类似问题