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.53C# は切り上げではなく切り上げを行うため、実際に得られます。例えば、

のような答えが得られたら、その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 関数と同様に、関数が呼び出された後に値を返します。関数は変数を変更しません。実際、これは double では不可能でした (ref パラメータを参照してください)。したがって、次のことを行う必要があります。

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/を参照してください。

于 2012-11-02T00:57:47.503 に答える