是否适合使用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. Android 5.1中的哪种类型的连续BLE扫描节省电量?
- 4. 分类算法,分类可以作为百分比
- 5. ggplot百分比乘以100
- 6. 分辨率的哪种数据类型
- 7. Spark:列值的百分比百分比
- 8. 显示百分比规模ggMarginal情节
- 9. 哪里可以节省很多分辨率的CCLabelBMFont资源
- 10. 累计百分比分类查询
- 11. 以百分比计算总分
- 12. 百分比SSRS
- 13. 百分比
- 14. 节省高分Android
- 15. CSS省略号时宽度设置为百分比不工作
- 16. 哪种类型的Eclipse
- 17. 从一种颜色到另一种颜色到百分比
- 18. 选择哪种分类?
- 19. 只允许0 - 100作为百分比值的表单类型
- 20. Hive中用于百分比的数据类型是什么?
- 21. 在MySQL中插入TIME类型值的百分比
- 22. 缺少PercentRelativeLayout百分比值的XML资源类型?
- 23. 插入excel中的百分比类型数据
- 24. 将单元格格式设置为数字类型“百分比”
- 25. 适用于保存百分比值的数据类型?
- 26. LSTM模型错误是一个输出类的百分比
- 27. Power BI Desktop不支持百分比列类型
- 28. 根据百分比值更改CSS类
- 29. SQL Server完成百分比类别
- 30. 如何以百分比返回函数?
很高兴知道为什么十进制代价更高。 – alexn 2010-07-05 19:18:35
感谢您的回答。我接受了,但Jay Bazuzi发表了一个非常广泛的回答,我认为这将有助于很多人在未来看到这篇文章。这就是为什么我将你接受的答案改变为Jay Bazuzi的回答。但是我从你的帖子中选择了自己的选择。谢谢。 – HCL 2010-07-05 20:04:01