是否適合使用double
類型來存儲百分比值(例如在應用程序商店的折扣百分比),或者它會更好地使用decimal
類型?哪種類型,以節省百分比
回答
浮點類型(float
和double
特別不適合於金融應用。
財務計算幾乎都是十進制,而浮點類型幾乎都是二進制的。這很容易代表了許多共同的價值觀十進制是不可能二進制來表示。例如,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
類型或從圖書館中選擇一個(搜索互聯網)。
decimal
不來以性能爲代價,但它通常是值得的金融用途。性能低下(所有數字類型中最差)的原因是它不直接映射到硬件類型。這意味着它需要用軟件完成更多的工作。
注意,它不僅是大小的問題。 decimal
是由10的冪縮放的整數,而浮點和雙精度類型由這意味着終止像0.1十進制值可以使用decimal
精確表示2的冪縮放,同時它們的非端接(因此圓形),用於float
和double
。
您可能會將折扣百分比保存爲整數。只需存儲10或25或任何東西,當你需要制定出價格的東西:
newprice = price * discount/100
我儘量避免浮點。沒有什麼比讓.25不等於.25更讓我感到憤怒,這是在你開始和他們打交道時發生的事情。
除二進制外,其中0.25確實是0.25。 0.1是一個更好的例子:) – 2010-07-05 19:28:04
對不起,沒有一個真正的例子,我的頭頂。 – 2010-07-05 19:34:54
浮點設計用於科學應用,其中數字*不精確*物理測量,計算使用*近似值*的函數,如'log'和'sin'。因此,0.1實際上是0.1000000000000000055511151231257827021181583404541015625這個事實不是問題:它精確到16位有效數字。 – dan04 2010-07-05 19:39:49
定期浮動應該是罰款,除非你需要的精度喜歡,小數點後五位。
「常規」浮點類型是「double」,而不是「float」。 'System.Math'方法都採用'double',而不是'float'。而且大多數浮點硬件(包括x87)都以雙精度或更高精度進行所有算術運算,因此浮點運算沒有性能優勢。當你擁有數百萬數字的數組時,「float」僅用於保存內存。 – dan04 2010-07-05 19:27:38
最好按照Jay的推薦,不要使用double
或float
作爲貨幣價值。
一般的做法是在C#中始終使用money
數據類型,在C#中使用decimal
。
- 1. SQL - 哪種數據類型表示百分比?
- 2. 哪個數據庫節省了各種類型的變量集?
- 3. 劃分long long類型的變量以獲得百分比?
- 4. 在百分比字段類型中刪除百分號
- 5. 我比較哪種數據類型?
- 6. Android 5.1中的哪種類型的連續BLE掃描節省電量?
- 7. 分類算法,分類可以作爲百分比
- 8. Swift2的switch語句中可以比較哪種類型的值
- 9. ggplot百分比乘以100
- 10. 分辨率的哪種數據類型
- 11. 關聯文件類型與程序,節省比的.java
- 12. Spark:列值的百分比百分比
- 13. 哪裏可以節省很多分辨率的CCLabelBMFont資源
- 14. 顯示百分比規模ggMarginal情節
- 15. 將字節轉換爲百分比
- 16. 累計百分比分類查詢
- 17. 樸素貝葉斯分類百分比
- 18. 以百分比計算總分
- 19. 用百分比
- 20. 百分比SSRS
- 21. 用百分比
- 22. 百分比
- 23. SQL百分比
- 24. SQL百分比
- 25. 節省高分Android
- 26. CSS省略號時寬度設置爲百分比不工作
- 27. 哪種類型的關聯?
- 28. 哪種類型的(翻轉)?
- 29. 哪種類型的Eclipse
- 30. 類,引用,以節省內存
很高興知道爲什麼十進制代價更高。 – alexn 2010-07-05 19:18:35
感謝您的回答。我接受了,但Jay Bazuzi發表了一個非常廣泛的回答,我認爲這將有助於很多人在未來看到這篇文章。這就是爲什麼我將你接受的答案改變爲Jay Bazuzi的回答。但是我從你的帖子中選擇了自己的選擇。謝謝。 – HCL 2010-07-05 20:04:01