哪种类型可以节省百分比

时间:2010-07-05 19:14:47

标签: c# .net

使用double类型存储百分比值(例如商店应用程序中的折扣百分比)是否合适?或者使用decimal类型会更好吗?

6 个答案:

答案 0 :(得分:34)

浮点类型(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。糟糕,错过了一个 - 小虫。)

根据您的需要,这将为您提供两个不错的选择。一个是decimal。这对于像10%这样的整个百分比来说都很棒,但不适用于像“今天只有1/3关闭!”这样的事情,因为1/3并不完全代表十进制。你喜欢它,如果在1/3的时候购买3件东西作为一个整数,对吗?

另一种是使用Fraction类型,它存储integer分子和分母。这允许您表示所有有理数的精确值。要么实现自己的Fraction类型,要么从库中选择一个(搜索互联网)。

答案 1 :(得分:9)

您可以将折扣百分比保存为整数。只需存储10或25或其他什么,当你需要计算出某些东西的价格时:

newprice = price * discount / 100

答案 2 :(得分:7)

decimal确实会带来性能成本,但对于财务用途来说通常是值得的。它具有低性能(所有数字类型中最差的)的原因是它不直接映射到硬件类型。这意味着它需要在软件中完成更多的工作。

请注意,这不仅仅是尺寸问题。 decimal是一个以10的幂为单位缩放的整数,而float和double类型的缩放是2的幂。这意味着终止十进制值(如0.1)可以使用decimal精确表示,而它们是非 - floatdouble的终止(并因此舍入)。

答案 3 :(得分:1)

我尽可能避免浮点数。没有什么比让.25不等于.25更让我恼火的了,当你开始处理它们时就会发生这种情况。

答案 4 :(得分:0)

Jay建议最好不要将doublefloat用于货币值。

一般做法是始终在SQL Server中使用money数据类型,在C#中使用decimal

答案 5 :(得分:-1)

常规浮点数应该没问题,除非你需要精确到五位小数。