我有這段代碼的時刻:C#Double不受Math.Round影響 - 爲什麼?
totalCost = fuelPrice * purchaseVolume;
totalCost = Math.Round(totalCost, 2);
Console.WriteLine("Total Cost = £" + totalCost);
如果燃料價格是1.15,體積爲2,console.writeline
然後顯示總成本爲2.3£,不是2.30,因爲我想實現。我究竟做錯了什麼?
我有這段代碼的時刻:C#Double不受Math.Round影響 - 爲什麼?
totalCost = fuelPrice * purchaseVolume;
totalCost = Math.Round(totalCost, 2);
Console.WriteLine("Total Cost = £" + totalCost);
如果燃料價格是1.15,體積爲2,console.writeline
然後顯示總成本爲2.3£,不是2.30,因爲我想實現。我究竟做錯了什麼?
那你是四捨五入,不格式化:-)
你不需要Math.Round
,您需要:
Console.WriteLine("Total Cost = £ {0:F2}", totalCost);
你可以看一下它是這樣的:在計算機內部代表的數字在某些格式。這些格式通常是二進制格式,並不是「單純的凡人」「難以辨認的」。 double
是這些格式之一。這是一種固定長度的格式,因此每個double
的長度爲8個字節。當你想把它打印到某個地方時,你必須將其「串化」(將其轉換爲人類可讀的格式)。在C#/ .NET中,通常使用所有對象都具有的ToString()
方法。
如今,在double
1.0 == 1.00 == 1,多餘的零不會被保存(因爲它們通常並不重要)
Math.Round
「生產」一double
與小數的(最大數我們會忽略double
的變幻莫測)。所以Math.Round(1.222, 2) == 1.22
,但Math.Round(1.0, 2) == 1
所以Math.Round
是一個函數,從double
返回double
。
Console.WriteLine
是不同的。在這種情況下,它需要一個double
和string
ify(並將其顯示到控制檯屏幕)。當您對一個數字進行字符串化並告知Console.WriteLine
在.
之後需要2位小數時,即使小數點爲零,它也會顯示2位小數。因此Console.WriteLine("{0:F2}", 1)
將打印1.00
。可能Console.WriteLine
使用ToString
方法double
來做到這一點。所以說實話,這將是更好的分析double
的ToString
方法,因爲Console.WriteLine("Total Cost = £ {0:F2}", totalCost)
可能是非常相似的內部,以Console.WriteLine("Total Cost = £ {0}", totalCost.ToString("F2"));
我幾乎忘了。像AVD一樣在你對帖子的評論中告訴你。 float
和double
可能是信息技術最大的兩個弊端。
啊我正確地看到,當然,雖然Math.Round方法應該工作? –
@ HTTP404一件事是如何在內存中表示一個數字(例如雙倍),另一件事是它如何顯示在屏幕上。在屏幕上它是一個「字符串」。因此,通過'Math.Round',你可以得到一個「記憶」數字,最大值爲**一定數量的數字(但是請記住,在計算機中,1.00 == 1.0 == 1並保存爲1(我們將無視內存中如何保存雙打))。但要格式化(將其「格式化」),必須將格式指定爲「Console.WriteLine」(或「ToString()」方法) – xanatos
您必須調用totalCost.ToString(「format」)。看here
顯示兩個數字的逗號使用此命令後:
Console.WriteLine(String.Format("Total Cost = £ {0}", totalCost.ToString("n2")));
我覺得Math.Round是不是你在這種情況下所需要的。
該循環仍需要強制該數量爲是有收費的(例如每公升1.319英鎊,1公升應收1.32英鎊 - 格式字符串不會爲你舍入)。 –
您需要格式化號碼,讓他們在小數部分尾隨零,例如:
Console.WriteLine(string.Format("Total Cost = £{0:F2}", totalCost));
您所描述的情況是不是四捨五入的問題,但格式的問題。如果你這樣做:
Console.WriteLine(string.Format("Total Cost = {0:c}" , totalCost))
你可能會得到你想要的,包括將取決於區域設置適當的貨幣符號什麼
的一點是,如果你輪2.3的第二個數字,你仍然可以得到2.3
否則,2.30和2.3是相同的數字。
你需要的是
Console.WriteLine("Total Cost = £{0:F2}", totalCost);
檢查這篇文章:.NET Format String 101
使用十進制類型貨幣計算 - http://stackoverflow.com/questions/1165761/decimal-vs-double-which-一個應該我使用和 - 當 – adatapost