1
295
我认为你已经很好地总结了这些优点。但你却错过了一点。这个
编辑: 关于您关于操作后浮点数字精度降低的其他问题,这是一个稍微微妙的问题。实际上,每次操作完成后,精度(这里我使用可互换的术语来表示精度)都会稳步下降。这是由于两个原因:
在所有情况下,如果要比较理论上应相等的两个浮点数(但使用不同的计算得出),则需要允许一定程度的公差(变化幅度很大,但通常非常小)。 有关可以引入精度错误的特定情况的更详细概述,请参阅 Wikipedia article . 最后,如果您希望在机器级别认真深入(和数学)讨论浮点数字/操作,请尝试阅读经常引用的文章。 What Every Computer Scientist Should Know About Floating-Point Arithmetic . |
2
55
使用浮点类型的好处似乎很明显。在所有情况下,我都倾向于设计小数,并且依赖于一个分析器来告诉我十进制操作是否会导致瓶颈或减速。在这些情况下,我将“向下强制转换”为双精度或浮点型,但只在内部进行,并通过限制正在执行的数学运算中的有效位数来小心地尝试管理精度损失。 通常,如果您的值是暂时的(不可重复使用),则可以安全地使用浮点类型。浮点类型的真正问题是以下三种情况。
编辑 根据 reference documentation on C# decimals :
为了澄清我的上述声明:
我只在小数有利的行业工作过。如果您正在使用phsyics或图形引擎,那么为浮点类型(float或double)设计可能更为有益。 十进制不是无限精确的(在基元数据类型中不可能表示非整数的无限精度),但它比双精度精确得多:
编辑2 响应 Konrad Rudolph 's comment,item 1(以上)是绝对正确的。不精确的集合确实是复合的。请参见下面的代码以获取示例:
输出如下:
正如您所看到的,即使我们从同一个源常量添加,double的结果也不那么精确(尽管可能会正确舍入),而float的精度也要低得多,直到它被减少到只有两个有效数字为止。 |
3
24
如其他人所建议的,使用十进制作为基数10的值,例如财务计算。 但对于任意计算值,double通常更精确。 例如,如果要计算投资组合中每一行的权重,请使用double,因为结果将更接近于100%。 在下面的示例中,doubleResult比decimalResult更接近1:
所以再次以投资组合为例:
|
4
6
当你不需要精确的时候,可以使用双精度或浮点数,例如,在我写的platformer游戏中,我使用浮点数来存储玩家的速度。很明显,我不需要超精确,因为我最终会取整到一个int来在屏幕上画图。 |
5
4
在某些会计中,考虑使用整型的可能性。例如,假设您在下面操作的规则要求每个计算结果都至少结转6位小数,最终结果将四舍五入到最接近的一分钱。 100美元的1/6计算得出16.666666666666美元……,因此工作表中的值将为16.666667美元。double和decimal都应该精确到6位小数。然而,我们可以通过将结果作为一个整数16666667进行结转来避免任何累积误差。每一个后续计算都可以以相同的精度进行,并以相同的方式进行。继续这个例子,我计算该金额的德州销售税(166667*.0825=1375000)。加上这两个(这是一个简短的工作表)1666667+1375000=18041667。把小数点移回去,我们得到18.041667美元,或者18.04美元。 虽然这个简短的示例不会使用double或decimal产生累积错误,但很容易显示只计算double或decimal并进行结转会累积显著错误的情况。如果您在下面操作的规则需要有限的小数位数,则将每个值存储为一个整数,乘以10^(小数位数的要求值),然后除以10^(小数位数的要求值),得到实际值,将避免任何累积错误。 如果分币没有出现(例如自动售货机),就没有理由使用非整数类型。简单地把它看成是计算硬币,而不是美元。我见过代码,每个计算只涉及整分钱,但使用双精度会导致错误!仅整数数学删除了该问题。所以我的非传统答案是,如果可能的话,放弃双精度和十进制。 |
6
3
如果需要与其他语言或平台进行二进制查询,那么可能需要使用标准化的float或double。 |
7
2
注意:本文基于十进制类型的功能信息 http://csharpindepth.com/Articles/General/Decimal.aspx 以及我自己对这意味着什么的解释。我假设双精度是标准的IEEE双精度。 注2:本帖中的最小值和最大值参考数字的大小。 “十进制”的优点。
十进制不等式
我的意见是,你应该默认使用“十进制”的货币工作和其他情况下,匹配人类计算是非常重要的,你应该使用双精度作为你的默认选择剩余的时间。 |
8
0
如果您重视性能而非正确性,请使用浮点。 |
9
0
选择应用程序的“输入”函数。如果你需要像财务分析那样的精确性,你已经回答了你的问题。但如果你的申请能以一个估计值来解决,你可以加倍。 您的应用程序需要快速计算,还是他会一直在世界上给您一个答案?这实际上取决于应用程序的类型。 图形饥饿?浮动或双浮动就足够了。财务数据分析,流星撞击行星的精度如何?那需要一点精确性:) |
10
0
十进制有更宽的字节,CPU本身支持双字节。十进制是以10为基数的,因此在计算十进制时会进行十进制到双精度的转换。
记住.NET CLR只支持math.pow(double,double)。不支持十进制。 .NET框架4
|
11
0
如果一个双精度值的符号短于十进制显示,那么默认情况下,该值将序列化为科学符号。(例如,0000000 3将是3e-8)十进制值永远不会序列化为科学记数法。当对外方进行消费系列化时,这可能是一个考虑因素。 |
12
0
取决于你需要它做什么。因为float和double是二进制数据类型 一些 二进位和二进位以整数形式出现,例如double将从0.1到0.10000001490116,double也将从1/3到0.33333334326441。简单地说,不是所有的实数都有精确的双类型表示。 幸运的是,C还支持所谓的十进制浮点运算,其中数字通过十进制数字系统而不是二进制系统来表示。因此,十进制浮点运算 不会丢失准确度 存储和处理浮点数时。这使得它非常适合需要高精度的计算。 |
Justin · 如何在Java中以全精度格式化double? 6 年前 |
Pernoctador · 两个给定数字之间的双精度密度 7 年前 |
INs · MySQL保存浮点错误 7 年前 |
Philip.W · 在C中格式化类似xxxxE+xx的双精度 7 年前 |