很明显,在使用货币金额时,不应该使用浮动精度,因为精确度的变化会导致在使用该金额进行计算时出现不准确。
那说,什么是可以接受的用例?而且,在决定时应该考虑的一般原则是什么?
答案 0 :(得分:3)
我猜你的意思是“浮点”。答案基本上是,任何时候涉及的数量都是近似的,测量的,而不是精确的;任何时候涉及的数量都大于可以方便地在底层机器上精确表示的数量;任何时候对计算速度的需求都会超过精确的精确度;任何时候都可以保持适当的精度而没有其他复杂性。
有关详细信息,您需要阅读数值分析书。
答案 1 :(得分:3)
浮点数应该用于它们的设计目标:计算你想要的是一个固定的精度,你只关心你的答案是否准确到一定的容差范围内。如果您在所有情况下都需要确切的答案,那么最好使用别的东西。
以下是您可能使用浮点的三个域:
科学模拟
科学应用程序需要大量的数字运算,并且经常使用复杂的数值方法来求解微分方程组。你通常在这里谈论双精度浮点。
<强>游戏强>
将游戏视为可以作弊的模拟游戏。如果物理学“足够好”似乎是真实的那么它对于游戏是可以的,并且你可以在用户体验中弥补你在准确性方面缺少的东西。游戏通常使用单精度浮点。
<强>统计强>
像科学应用程序一样,统计方法需要很多浮点。很多数值方法都是一样的;应用程序域是不同的。您可以在财务应用程序中以及在分析大量调查数据的任何领域中找到大量统计数据和蒙特卡罗模拟。
浮点并非易事,对于大多数业务应用程序,您实际上并不需要了解所有这些细微之处。你知道你不能完全用浮点表示一些十进制数字,并且你应该确保使用一些小数类型的价格和类似的事情。你好。
如果您真的想了解细节并了解所有权衡和陷阱,请查看经典What Every Programmer Should Know About Floating Point,或者如果您要Numerical Analysis或Applied Numerical Linear Algebra,请选择一本书。真的很冒险。
答案 2 :(得分:2)
大多数真实世界的数量都是不精确的,通常我们知道它们的数值属性,其精度远低于典型的浮点值。几乎在所有情况下,C类型float和double都足够好。
有必要了解一些陷阱。例如,测试两个浮点数是否相等通常不是你想要的,因为只需要一点不准确就可以使比较不相等。 tgamblin提供了一些很好的参考。
通常的例外是货币,它完全根据某些惯例计算得不能很好地转化为二进制表示。部分原因是使用的常数:您永远不会看到pi%利率或22/7%的利率,但您可能会看到3.14%的利率。换句话说,使用的数字通常以精确的小数部分表示,并非所有数字都是精确的二进制分数。此外,计算中的舍入由惯例控制,这些约定也不能很好地转换为二进制。这使得使用标准浮点精确复制财务计算变得非常困难,因此人们会使用其他方法。
答案 3 :(得分:2)
简短的说法是,如果您需要完全计算,请不要使用浮点数。
不要使用浮点数作为循环索引:不要被抓住做:
for ( d = 0.1; d < 1.0; d+=0.1)
{ /* Some Code... */ }
你会感到惊讶。
不要使用浮点数作为任何类型地图的键,因为你永远不能指望你所期望的平等行为。
答案 4 :(得分:1)
在处理科学或统计计算时,使用浮点类型是合适的。这些将总是只有3-8位有效数字。
关于是使用单精度还是双精度浮点类型,这取决于您对精度的需求以及您需要多少有效位数。通常情况下,人们最终会使用双打,除非他们有充分的理由不这样做。
例如,如果您测量距离或重量或任何物理量,那么您提出的数字并不准确:根据您的仪器和测量精度,它有一定数量的有效数字。
对于涉及此类事件的计算,浮点数是合适的。
另外,如果你处理的是非理性数字,浮点类型是合适的(而且确实是你唯一的选择),例如线性代数,你需要处理平方根。
金钱是不同的,因为你通常需要准确,每个数字都很重要。
答案 5 :(得分:1)
我认为你应该反过来问:什么时候不应该使用浮点数。对于大多数数字任务,浮点是首选数据类型,因为您可以(几乎)忘记整数类型通常遇到的溢出和其他类型的问题。
查看浮点数据类型的一种方法是精度与动态无关,即数字是否非常小(当然在可接受的范围内),有意义数字的数量大约是相同。
一个缺点是浮点数有一些令人惊讶的属性,比如x == x可能是假的(如果x是nan),它们不遵循大多数数学规则(分配,即x(y + z)!= x y + x z)。根据z,y和z的值,这很重要。
答案 6 :(得分:0)
来自Wikipedia:
浮点运算就在它的位置 当它被简单地习惯时最好 测量真实世界的数量 广泛的尺度(如 轨道周期的Io或质量 质子),最糟糕的时候 预计将模拟相互作用 数量表示为十进制 预期准确的字符串。
浮点数很快但不准确。如果这是可接受的权衡,请使用浮点。