2010-07-05 73 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