我总是在c#中告诉您double类型的变量不适合钱。所有奇怪的事情都可能发生。但是我似乎无法创建一个示例来演示其中的一些问题。谁能提供这样的例子?
(编辑;此帖子最初被标记为C#;一些回复涉及的具体细节decimal
,因此,这意味着System.Decimal
)。
(编辑2:我是专门要求一些C#代码的,所以我不认为这仅与语言无关)
我总是在c#中告诉您double类型的变量不适合钱。所有奇怪的事情都可能发生。但是我似乎无法创建一个示例来演示其中的一些问题。谁能提供这样的例子?
(编辑;此帖子最初被标记为C#;一些回复涉及的具体细节decimal
,因此,这意味着System.Decimal
)。
(编辑2:我是专门要求一些C#代码的,所以我不认为这仅与语言无关)
Answers:
舍入会有效地导致奇数错误。此外,与精确值进行比较非常棘手-您通常需要应用某种epsilon来检查“接近”特定值的实际值。
这是一个具体的例子:
using System;
class Test
{
static void Main()
{
double x = 0.1;
double y = x + x + x;
Console.WriteLine(y == 0.3); // Prints False
}
}
是的,这不合适。
如果我没记错的话,double大约有17个有效数字,所以通常舍入错误将发生在小数点后。大多数财务软件在小数点后使用4位小数,这使13位小数可以使用,因此一次操作可以使用的最大数目仍然远远高于美国国债。但是舍入错误会随着时间的推移加总。如果您的软件运行了很长时间,您最终将开始损失美分。某些操作会使情况更糟。例如,将大量添加到少量将导致精度显着下降。
您需要定点数据类型来进行货币操作,大多数人不介意您在这里和那里失去一分钱,但会计师并不像大多数人那样。
根据此网站进行编辑http://msdn.microsoft.com/en-us/library/678hzkk9.aspx双打居然有15至16位显著,而不是17。
@Jon Skeet十进制比double更适合,因为它具有更高的精度,即28或29个有效小数。这意味着累积的舍入误差出现的可能性较小。像Boojum提到的定点数据类型(例如,代表美分或美分的整数)实际上更适合。
decimal
该表达式x + 1 != x
始终比是正确的,甚至比仅保留十进制浮点数更为重要。另外,它还保持精度,因此您可以分辨出1
和之间的区别1.0
。
Decimal
值可能会失去小数点右边的精度,而不表示任何问题。
double
仅具有15.9个有效十进制数字(仅考虑整数值)。小数点后的情况取决于值。
由于decimal
使用的比例因子为10的倍数,因此可以精确表示0.1之类的数字。本质上,十进制类型将其表示为1/10 ^ 1,而adouble
则将其表示为104857/2 ^ 20(实际上,它更像是真正的大数字/ 2 ^ 1023)。
Adecimal
可以精确地代表任何以10为基数的值,最多可包含28/29个有效数字(例如0.1)。一个double
不能。
我的理解是,大多数金融系统都使用整数表示货币-即以美分来计数所有内容。
IEEE双精度实际上可以表示介于-2 ^ 53到+ 2 ^ 53之间的所有整数。(Hacker's Delight,第262页)如果仅使用加,减和乘,并将所有内容都保持在此范围内的整数,那么您应该不会损失任何精度。但是,我会非常谨慎地对待部门或更复杂的业务。
double
,但不支持任何64位整数类型。我建议将按double
语义进行的舍入按比例进行缩放,以使语义上需要的舍入始终以整单位为单位,这将是最有效的方法。
当您不知道自己在做什么时使用double是不合适的。
“ double”可以代表一万亿美元的金额,其误差为1/90美分。这样您将获得高度精确的结果。想计算将一个人送上火星并使他复活的费用吗?加倍就可以了。
但是对于金钱,通常有非常具体的规则说,某种计算必须给出某种结果,而没有其他结果。如果您计算的金额非常非常接近$ 98.135,那么通常会有一个规则来确定结果应为$ 98.14还是$ 98.13,并且您必须遵循该规则并获得所需的结果。
根据您的住所,使用64位整数代表美分,便士或科比或您所在国家/地区中最小的单位通常都可以用。例如,代表美分的64位有符号整数可以表示高达92,223万亿美元的值。通常不适合使用32位整数。
没有双精度型将始终存在舍入错误,如果您使用的是.Net,请使用“十进制” ...
实际上,只要选择一个合适的单位,浮点双精度就非常适合表示金额。
参见http://www.idinews.com/moneyRep.html
因此定点长。要么消耗8个字节,肯定好于十进制消耗的16个字节项。
某事是否有效(即产生预期的正确结果)与投票或个人偏好无关。一项技术有效或无效。