1
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技巧也不起作用。请记住,我是一名新学生,因此,如果答案可以是菜鸟安全的,那就太好了。谢谢。

4

3 回答 3

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

于 2012-11-02T00:57:37.533 回答
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/以获取您的 write 函数调用。

于 2012-11-02T00:57:47.503 回答
0

模数也可以。(很难说哪个在安全性、可读性和性能方面更好。)

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

截断小数点后两位不四舍五入的类似问题

于 2017-05-15T20:11:48.837 回答