2010-07-05 51 views

回答

28

浮點類型(floatdouble特別不適合於金融應用。

財務計算幾乎都是十進制,而浮點類型幾乎都是二進制的。這很容易代表了許多共同的價值觀十進制是不可能二進制來表示。例如,0.2d = 0.00110011...b。一個良好的討論,請參見http://en.wikipedia.org/wiki/Binary_numeral_system#Fractions_in_binary

另外值得一談你是如何在你的系統代表的價格。decimal是一個不錯的選擇,但浮動點是不是,爲理由清單以上所述。因爲你相信面向對象編程,所以你會把這個decimal換成新的Money類型,對嗎?對Kent Beck的Test Driven Development by Example進行了很好的處理。

也許你會考慮代表比例爲整數,然後通過100每次使用它的時間劃分。然而,你正在設置自己的錯誤(哎呀,我忘了劃分)和未來的不靈活性(客戶想要百分之十分之一,所以去修復每個/100/1000。糟糕,錯過了一個bug。)

這給你留下了兩個不錯的選擇,這取決於你的需求。一個是decimal。對於像10%這樣的整數百分比來說,這很好,但不適用於像「今天只有三分之一!」這樣的事情,因爲1/3不能完全代表十進制。如果以1/3的比例購買3個東西作爲整數出現,你會喜歡它,對吧?

另一種方法是使用Fraction類型,它存儲一個integer分子和分母。這使您可以表示所有有理數的精確值。您可以實施自己的Fraction類型或從圖書館中選擇一個(搜索互聯網)。

7

decimal不來以性能爲代價,但它通常是值得的金融用途。性能低下(所有數字類型中最差)的原因是它不直接映射到硬件類型。這意味着它需要用軟件完成更多的工作。

注意,它不僅是大小的問題。 decimal是由10的冪縮放的整數,而浮點和雙精度類型由這意味着終止像0.1十進制值可以使用decimal精確表示2的冪縮放,同時它們的非端接(因此圓形),用於floatdouble

+1

很高興知道爲什麼十進制代價更高。 – alexn 2010-07-05 19:18:35

+0

感謝您的回答。我接受了,但Jay Bazuzi發表了一個非常廣泛的回答,我認爲這將有助於很多人在未來看到這篇文章。這就是爲什麼我將你接受的答案改變爲Jay Bazuzi的回答。但是我從你的帖子中選擇了自己的選擇。謝謝。 – HCL 2010-07-05 20:04:01

8

您可能會將折扣百分比保存爲整數。只需存儲10或25或任何東西,當你需要制定出價格的東西:

newprice = price * discount/100 
+3

有時,商店確實喜歡用更復雜的金額來折扣商品。如果一個商店有一個「無銷售稅」的銷售,他們需要打折的數量會產生銷售稅後的正常價格,如果銷售稅是9.7%的東西,這將是一個醜陋的 - 尋找折扣百分比。 – Travis 2010-07-05 19:22:33

+2

@morbo,我擔心他們會用不規則的常量或數學表達式打折。 – Incognito 2010-07-05 19:24:06

+4

僅限今天,購買時請取消\ int_0^1 e^x dx! – Donnie 2010-07-05 19:32:13

1

我儘量避免浮點。沒有什麼比讓.25不等於.25更讓我感到憤怒,這是在你開始和他們打交道時發生的事情。

+2

除二進制外,其中0.25確實是0.25。 0.1是一個更好的例子:) – 2010-07-05 19:28:04

+0

對不起,沒有一個真正的例子,我的頭頂。 – 2010-07-05 19:34:54

+0

浮點設計用於科學應用,其中數字*不精確*物理測量,計算使用*近似值*的函數,如'log'和'sin'。因此,0.1實際上是0.1000000000000000055511151231257827021181583404541015625這個事實不是問題:它精確到16位有效數字。 – dan04 2010-07-05 19:39:49

-1

定期浮動應該是罰款,除非你需要的精度喜歡,小數點後五位。

+1

「常規」浮點類型是「double」,而不是「float」。 'System.Math'方法都採用'double',而不是'float'。而且大多數浮點硬件(包括x87)都以雙精度或更高精度進行所有算術運算,因此浮點運算沒有性能優勢。當你擁有數百萬數字的數組時,「float」僅用於保存內存。 – dan04 2010-07-05 19:27:38

0

最好按照Jay的推薦,不要使用doublefloat作爲貨幣價值。

一般的做法是在C#中始終使用money數據類型,在C#中使用decimal