我总是告诉在c#double类型的变量是不适合的钱。所有奇怪的事情都可能发生。但我似乎无法建立一个例子来说明一些问题。任何人都可以提供这样的示例

(编辑;该讯息最初标记C#;一些答复指decimal的具体细节,因此该装置的 System.Decimal )。

(编辑2:我是具体要求一些C#代码,所以我不认为这是语言无关的唯一)

有帮助吗?

解决方案

非常,非常不适合的。使用十进制。

double x = 3.65, y = 0.05, z = 3.7;
Console.WriteLine((x + y) == z); // false

(例如,从Jon的页面此处 - 推荐阅读;-p)

其他提示

您将获得由四舍五入引起的有效奇错误。此外,与精确值比较是非常棘手 - 你通常需要应用某种小量的检查实际值是“近”的一个特定

下面是一个具体的例子:

using System;

class Test
{
    static void Main()
    {
        double x = 0.1;
        double y = x + x + x;
        Console.WriteLine(y == 0.3); // Prints False
    }
}

是它是不适合的。

如果我没有记错的双大约有17显著的数字,因此通常舍入误差将于远远落后于小数点。大多数金融软件使用小数点后面4位小数,留下13个小数的工作,所以你可以工作单操作的最大数量仍比美国国债高得多。但舍入误差将增加随着时间的推移。如果你的软件运行很长时间,你最终会开始失去美分。某些操作将使这更糟。例如加入大量小的量将导致精度显著损失。

您需要钱操作固定点数据类型,如果你在这里和那里失去%,但会计师是不是大多数人不介意跟大多数人一样..

修改结果 据本网 http://msdn.microsoft.com/en-us/library /678hzkk9.aspx 双打实际上有15至16个显著位而不是17。

@乔恩碟小数比双的,因为它的较高的精度,28或29个显著小数更合适。这意味着更少的积累的舍入误差成为显著机会。固定点数据类型一样Boojum提到(即代表美分或100一分的像我见过使用整数)实际上是更适合。

由于decimal使用的10的倍数的缩放因子,如0.1号码可以精确表示。在本质上,小数类型表示该为1/10 ^ 1,而double将代表此作为二分之十万四千八百五十七^ 20(实际上它会更喜欢真-大数目 / 2 ^ 1023)。

一个decimal可以完全代表具有高达28/29显著数字(如0.1)的任何碱值10。甲double不能。

我的理解是,大多数金融系统使用整数表示货币 - 即,在仙计一切

IEEE双精度实际上可以的准确表示的范围内的所有整数-2 ^ 53 +通过2 ^ 53。 (黑客的喜悦,第262),如果你只使用加法,减法和乘法,并保持在这个范围内的一切整数,那么你应该看不到任何的精度损失。我会非常警惕分裂或更复杂的操作,但是。

采用双,当你不知道自己在做什么,是不合适的。

“双重”可以表示与一个分的1/90的误差的一万亿美元的量。所以,你会得到非常精确的结果。要计算多少成本来把人送上火星,并让他活着回来?双会做得很好。

但用钱经常有说有一定的计算必须给予一定的结果,并没有其他的非常具体的规则。如果计算量,这是非常非常非常近$ 98.135那么往往会决定结果是否应该是$ 98.14或$ 98.13的规则,你的必须的遵循规则,并得到所需要的结果。

根据你住的地方,使用的是64位整数代表美分硬币或戈比或无论是在贵国的最小单位通常会工作得很好的。例如,64位有符号表示美分可以代表值高达92223万亿美元的整数。 32个整数,通常不适合的。

没有双重总是有舍入误差,如果你是在净...

使用“十进制”

实际上浮点的是完全适合于只要你选择一个合适的单位表示的金钱量。

请参阅 http://www.idinews.com/moneyRep.html

所以固定点的即可。或者消耗的8个字节,当然优选通过的小数项所消耗的16。

无论什么工作(即产生预期的和正确的结果)是也不投票或个人偏好的问题。一种技术无论是工作或没有。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top