我经常看到人们在C中使用双打。我知道我在某个地方读到双打有时会失准。我的问题是A何时应该使用double,何时应该使用decimal类型?哪种类型适合于货币计算?(即超过1亿美元)
- 你要分币吗?(比如加油站)
- stackoverflow.com/questions/803225/…
- 实际上有一个相当好的答案:十进制的工作方式就像一个长整数(它是一个整型!)但是它的语法和输出格式中有一个点(参见en.wikipedia.org/wiki/integer_uu(computer_science))。double和float使用尾数和指数(参见en.wikipedia.org/wiki/floating_point)。就是这样。
- 请参见以下链接:net-informations.com/q/faq/float.html
为了钱,总是小数。这就是它被创造的原因。
如果数字必须正确相加或平衡,请使用小数。这包括人们可能用手做的任何财务存储或计算、分数或其他数字。
如果数字的精确值不重要,请使用double表示速度。这包括图形、物理或其他物理科学计算,其中已经有"有效数字数"。
- 并不是说double是不准确的——它具有相对的准确性,可以表示小数点根本无法处理的非常大或很小的幅度。
- 这就是为什么你要用十进制来赚钱:double的精度只有16位十进制数字,经过几次算术运算后,错误很快就会累积到足够大的数字上,从而蔓延到15、14、13等数字。四舍五入到"分"后至少需要一个完全准确的数字,但实际上,您应该保留4或5以避免累积算术错误,您不能允许损坏用于四舍五入分的百分位列。这就给你留下了16(总计)-2(分)-(4或5个错误填充)=oh$hit为你的钱只有7(或更少)个可靠的整数!
- 因此,我不会操纵超过9.99美元(1个整数位数)的货币值,因为我想要的不是4或5位数的错误累积填充,而是10或11。因为十进制是一个128位的数字,所以它给你一种孤立的感觉,即使有数百万亿美元的数字,因为它有28-29位的精度。不过,你不能再高得多了。99999999999999.99r(999万亿)需要18位精度才能正确舍入,因为小数点表示28-29,所以累积算术误差绝缘只有10位。
- 只是为了磨擦它…如果你正在建立一个游戏,你真的会关心你刚刚投过一个四分之一英里的炸药桶是否因为数百个"位置+(速度*时间)"步骤的累积误差而落在离目标1/16英寸的地方吗?我对此表示怀疑。
- 要清除这个数字,双精度数不能有16个数字——这只是有意义的数字的数目。浮点数基于基2数学中的指数-一些基10数字已损坏,因为在二进制浮点数0.1 * 0.1 != 0.01中,如果转换为基2 exp,它们是一个无限序列,因为0.1不能精确表示。数学运算也会导致用美元和美分进行漂移加和减,你可以得到0.9999999999这样的数字。toString()最初通过四舍五入隐藏此项,但会立即中断精确的比较。
- @Triynko:请注意,十进制是以10为基数的,这意味着它可以精确地表示0.30美元这样的货币值。这意味着只要你只做整数的加法、减法和乘法,你就不会有任何四舍五入错误。所以它没有28位的准确度,它有完美的准确度。与二进制浮点数(如double)相比,这是一个巨大的差异,double不能精确表示0.30美元。
- 我可以识别具有固定精度十进制类型的值,但我不喜欢Decimal的自动浮动行为。如果50个人每人购买一件"3/$1"的物品,那么收集的总金额可能不会是$16.67,但更可能是$16.50或$17.00,这取决于客户的收费是$0.33还是$0.34。虽然Decimal足够大,不太可能发生舍入精度的显著损失,但它无法知道舍入错误发生时有多少位是"重要"的或警告。
- "为了钱,总是十进制的",不是真的-看这里,特别是杰弗里·汉廷的答案:stackoverflow.com/questions/2604003/for-money-always-decimal
- @你链接到的问题是关于vb库,vb没有小数。这与这次讨论完全无关。
- "VB达沃。有一个十进制类型(msdn.microsoft.com /金/图书馆/ xtba3z33.aspx),《货币与VB6 -这是等效的数据类型。杰弗里的冰perfectly两个相关的答案:"在讨论金融函数使用浮几点原因:他们不internally accumulate——他们都是基于一个封闭的形式,该指数/对数和迭代求和,不超过期。"我是不相关的。
- "CBP杰夫瑞的冰回答说不相干的,因为他说的是什么Financial键槽的类,函数的通用金融(固定在他的答案)。你没有读他的全部答案,这使得它的透明的冰,decimal更好的金融业务。他说:"城市使用十进制算术,你避免引入磷断和方位误差。"鸭子",他们都是意图……对决策支持和…有两个小的实际制造bookkeeping。"鸭子",但一次冰量determined [其他],一切都发生在decimal。"。
- CBP也","芒了VB在这个论坛的帖子的,即使有decimal.net VB,VB 6没有,和Microsoft.VisualBasic.Financial函数使用Doublebackwards是完全兼容的,不是因为它是"适当的"数据类型的操作。
- 货币的小数的,永远的,或不威胁或十进制货币的,永远的,只有C #吗?
- 为什么不使用两个代表国际货币?城市100分在你的观点
- 在"arijoon相信的是什么类型的essentially小数冰做的,除了你,它可以把城市个数为大于100的适当的,因为一些系统保持超过2的小数精度的地方银行的钱。(例如,比特币,)关键是decimal类型的冰dividing A市电力10城市尽头一双冰dividing功率2。
My question is when should a use a
double and when should I use a decimal
type?
decimal,用于处理10^(+/-28)范围内的值以及基于10个表示(基本上是金钱)对行为有预期的情况。
double用于当您需要相对精度(即大值尾随数字的精度降低不是问题)时,跨越非常不同的大小-double覆盖超过10^(+/-300)。科学计算是最好的例子。
which type is suitable for money
computations?
十进制、十进制、十进制
不接受替代品。
最重要的因素是,double作为一个二进制分数来实现,根本无法准确地表示许多decimal分数(如0.1),而且由于它是64位宽的,而decimal是128位宽的,所以它的总位数较小。最后,金融应用程序通常必须遵循特定的四舍五入模式(有时由法律强制)。decimal支持这些;double不支持。
- 毫无疑问,在表示财务价值时不使用double,但与decimal相比,当您写到double不支持特定的舍入模式时,您的确切意思是什么?afaik,Math.Round有重载,接受double和decimal的MidpointRounding参数?
- @格罗:我想我一定看过.net 1.1api,这个方法是在2.0中添加的,但是由于二进制分数的问题,它仍然有点毫无意义。在当前的api文档中有一个例子说明了这个问题。
- 在许多比较中看到了这一行,但无法理解其含义。你能详细解释一下吗?"double不能精确地表示许多小数(如0.1)。"
- @lmad:我有一个网站,上面写着:floating-point-gui.de——基本上就是因为这个原因,十进制数字不能精确地表示1/3。
- @当你说"十进制,十进制,十进制"时,我应该用哪一个?
系统.单/浮点数-7位系统。双/双-15-16位数字十进制/十进制-28-29位有效数字
我被错误的类型所刺痛(几年前)的方式是大量使用:
- 520532.52英镑-8位数
- 1323523.12英镑-9位数
你花了100万换一个浮球。
15位数的货币价值:
9万亿,加倍。但是对于除法和比较法来说,它更复杂(我绝对不是浮点和无理数方面的专家——见马克的观点)。小数和双精度混合会导致问题:
A mathematical or comparison operation
that uses a floating-point number
might not yield the same result if a
decimal number is used because the
floating-point number might not
exactly approximate the decimal
number.
我什么时候应该用double而不是decimal?有一些类似和更深入的答案。
在货币应用中使用double而不是decimal,是一种微观优化——这是我看待它的最简单方式。
- 520,532.52有8个有效数,1,323,523.12有9个mathsfirst.massey.ac.nz/algebra/decimals/sigfig.htm
小数表示精确值。double表示近似值。
1 2 3
| USD: $12,345.67 USD (Decimal)
CAD: $13,617.27 (Decimal)
Exchange Rate: 1.102932 (Double) |
- 冰不精确的十进制值。十进制小数点提供28位的精度按《文件。十进制算术不perform分析和冰槽,因此"精确"。小数点冰大物有所值,因为在平衡与trillions美元,让它离开你与10位大学cumulative绝缘从算术错误,但我仍然能够accurately方位两美分。
- 为什么是双交换速率和没有小数点?那不是简单的"价格也在CAD 1美元吗?
- 杰瑞特:汇率是不安的"价格"(在CAD 1美元。它的价值比同行的两个。取决于你如何determines十进制源多的地方,你一定会的。例如,1美元的价值1.0016 CAD的冰。1大britian磅冰沃斯1.5909 CAD。1 vietnamese董冰沃斯0.000048 CAD。这是一个比realistically不能为这样的界限的任何地方,没有失败的精密。
- @Gerrit 0.000048来自加拿大银行。Xe说一个VND值0.0000478405加拿大人。它们被计算为一个除法,从而产生一个浮点值。
- 不,小数不准确。对于上面例子中的汇率,您应该使用十进制,因为输入和输出是以10为基数的(当使用double时,在基本转换上会丢失精度,因为在基本因子分解中没有5)。
- 汇率并非完全相反,这也是事实:通常情况下,通过朝一个方向比另一个方向走,你会得到"更少的钱",这样,如果你反复转换,最终金额会变为零。这是由于两种利率不同,而不是由于费用或甚至四舍五入。
- 小数浮点数和二进制浮点数一样精确。关键的区别在于从十进制货币到十进制和二进制的转换。实现细节的区别在于数据类型长度(128位对64位)。除了后者,它们都是不准确的。
- @Sebastianmach十进制可以被认为比二进制更精确,因为通常用传统数学表示的所有值都可以精确地表示(范围内的任何10进制数),而在二进制表示中有许多10进制数"损坏"。这两个系统都有舍入错误,但十进制在执行除法时只会引入舍入错误,而二进制在解析以10为基数的数字时只会引入舍入错误。
- @BlueMonkmn:这基本上是一种更华丽的说法,"十进制浮点和二进制浮点一样精确。关键的区别在于从十进制货币到十进制和二进制的转换。我认为重要的是要掌握十进制浮点数和二进制浮点数一样精确。问题在于不同碱基之间的转换。
- @Sebastianmach真、十进制和二进制浮点数通常能够以相同的精度表示数字。但我要注意的一点是,大多数"真实世界"的数字都是用十进制表示的,所以在一个不以100%精度表示这些值的系统中,您更可能遇到不精确的情况…如果你知道你在处理小数点,比如货币金额。我可能忽略了理解你的评论是否是对另一个评论的回应,但这也是比较时理解的一个重要点。
- @布鲁蒙克曼:是的。如果不是十进制数字,人类将最大化他们的"10指缓存"来存储二进制数字,并在生活的大部分方面使用二进制数字,我们都会没事的。
为了钱:decimal。它需要更多的内存,但有时不会像double那样出现舍入问题。
- 它有四舍五入的所有问题:尝试1m/3m + 1m/3m == 2m/3m。主要的区别是-更多的有效位,最重要的是:当对除数的素数因子分解为5的数字进行运算时,没有精度损失。例如,1m/5m + 1m/5m与2m/5m完全相同。
一定要用整数类型来计算你的钱。这一点还不够强调,因为乍一看,浮点类型似乎是足够的。
下面是Python代码中的一个示例:
1 2 3 4 5 6 7 8
| >>> amount = float(100.00) # one hundred dollars
>>> print amount
100.0
>>> new_amount = amount + 1
>>> print new_amount
101.0
>>> print new_amount - amount
>>> 1.0 |
看起来很正常。
现在用10^20津巴布韦元再试试这个
1 2 3 4 5 6 7 8
| >>> amount = float(1e20)
>>> print amount
1e+20
>>> new_amount = amount + 1
>>> print new_amount
1e+20
>>> print new_amount-amount
0.0 |
如你所见,美元消失了。
如果使用integer类型,则可以正常工作:
1 2 3 4 5 6 7 8
| >>> amount = int(1e20)
>>> print amount
100000000000000000000
>>> new_amount = amount + 1
>>> print new_amount
100000000000000000001
>>> print new_amount - amount
1 |
- 你甚至不需要非常大的/小的两个值之间的差异,找到近似双基数与实际值10多座,小的值不能被accurately仓库。"calculate 1∶0.1~0.9"(《编译器确保不出《OPTIMIZE compare方程),和它的两个零。你会发现,结果与双冰之类的东西,而不是17 2 0(确保你跑compare A,AA toString打印/多功能双圆断过去某数的小数点的地方除去这些类型的错误)。
- 整数?鸭会发生什么!当你有1.5美元吗?
- "来时你会有一个IP的解决方案,如果你想它
- :)有很多的解决方案,但他说的是什么是双和小数点,婊子,婊子,除非他的父亲时,他会...that方需要小数点的答案,你为什么打我的怪异。
- 一些电脑游戏使用integers(夜)。这是一个简单的系统,没有分数的主要货币单位(美分)。
- 没有理由使用int而不是decimal精度为目的(也许因为性能的原因)。避免使用Double,但decimal。十进制辨别一座10指数至少我不rounding BINARY遭遇同样的错误,你做的一双当解析一座10样值0.1。
我认为位宽度旁边的主要区别是十进制以10为底,double以2为底
http://software-product-development.blogspot.com/2008/07/net-double-vs-decimal.html