2011-10-20 192 views
3

我有這段代碼的時刻: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,因爲我想實現。我究竟做錯了什麼?

+1

使用十進制類型貨幣計算 - http://stackoverflow.com/questions/1165761/decimal-vs-double-which-一個應該我使用和 - 當 – adatapost

回答

6

那你是四捨五入,不格式化:-)

你不需要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是不同的。在這種情況下,它需要一個doublestring ify(並將其顯示到控制檯屏幕)。當您對一個數字進行字符串化並告知Console.WriteLine.之後需要2位小數時,即使小數點爲零,它也會顯示2位小數。因此Console.WriteLine("{0:F2}", 1)將打印1.00。可能Console.WriteLine使用ToString方法double來做到這一點。所以說實話,這將是更好的分析doubleToString方法,因爲Console.WriteLine("Total Cost = £ {0:F2}", totalCost)可能是非常相似的內部,以Console.WriteLine("Total Cost = £ {0}", totalCost.ToString("F2"));

我幾乎忘了。像AVD一樣在你對帖子的評論中告訴你。 floatdouble可能是信息技術最大的兩個弊端。

+0

啊我正確地看到,當然,雖然Math.Round方法應該工作? –

+0

@ HTTP404一件事是如何在內存中表示一個數字(例如雙倍),另一件事是它如何顯示在屏幕上。在屏幕上它是一個「字符串」。因此,通過'Math.Round',你可以得到一個「記憶」數字,最大值爲**一定數量的數字(但是請記住,在計算機中,1.00 == 1.0 == 1並保存爲1(我們將無視內存中如何保存雙打))。但要格式化(將其「格式化」),必須將格式指定爲「Console.WriteLine」(或「ToString()」方法) – xanatos

3

您必須調用totalCost.ToString(「format」)。看here

3

顯示兩個數字的逗號使用此命令後:

Console.WriteLine(String.Format("Total Cost = £ {0}", totalCost.ToString("n2"))); 

我覺得Math.Round是不是你在這種情況下所需要的。

+0

該循環仍需要強制該數量爲是有收費的(例如每公升1.319英鎊,1公升應收1.32英鎊 - 格式字符串不會爲你舍入)。 –

3

您需要格式化號碼,讓他們在小數部分尾隨零,例如:

Console.WriteLine(string.Format("Total Cost = £{0:F2}", totalCost)); 
3

您所描述的情況是不是四捨五入的問題,但格式的問題。如果你這樣做:

Console.WriteLine(string.Format("Total Cost = {0:c}" , totalCost)) 

你可能會得到你想要的,包括將取決於區域設置適當的貨幣符號什麼

4

的一點是,如果你輪2.3的第二個數字,你仍然可以得到2.3
否則,2.30和2.3是相同的數字。

你需要的是

Console.WriteLine("Total Cost = £{0:F2}", totalCost); 

檢查這篇文章:.NET Format String 101

相關問題