【发布时间】:2017-02-21 16:56:41
【问题描述】:
我支持金融 .net 应用程序。有很多建议将 decimal 数据类型用于财务数据。
现在我被这个困住了:
decimal price = 1.0m/12.0m;
decimal quantity = 2637.18m;
decimal result = price * quantity; //results in 219.76499999999999999999999991
问题是向我们的客户收取费用的正确值是 219.77(舍入函数,MidpointRounding.AwayFromZero)而不是 219.76。
如果我将所有内容都更改为双倍,它似乎可以工作:
double price = 1.0/12.0;
double quantity = 2637.18;
double result = price * quantity; //results in 219.765
我要把所有的东西都改成双倍吗?分数会有其他问题吗?
我认为这个问题与Difference between decimal, float and double in .NET? 不同,因为它并没有真正向我解释为什么具有更精确数据类型 decimal 的结果比使用的结果更不准确(在上面的示例中)使用较少字节的 double 数据类型。
【问题讨论】:
-
只是计算中的一个基本缺陷,除非你用 12 个手指数数,否则 1/12 永远不会有完美的结果。什么样的公司会向他们的客户收取 12 美元的商品费用?您必须先确定正确的单价。
-
“我应该把所有东西都改成双倍吗?” - 为什么?您发现了一个未满足您的期望的示例(尽管正如 Hans 指出的那样,您有一个奇怪的起点,即您的单位价格不容易表示,然后我要指出这不是单位价格,因为您显然可以细分您的单位)。最好为您的数量选择更好的表示。很有可能,有可能找到相同和相反的例子,其中
decimal适合并且double产生错误的结果。 -
把除法放在最后:
1m*2637.18m/12m而不是1m/12m*2637.18m。 -
@PetSerAI:将除法放在最后确实会改变结果:219.765M。 Tnx 为那个。