代码之家  ›  专栏  ›  技术社区  ›  Edward Q. Bridges

何时使用浮动精度数据类型合适?

  •  5
  • Edward Q. Bridges  · 技术社区  · 17 年前

    很明显,在处理(比如)货币金额时,不应该使用浮动精度,因为精度的变化会导致使用该金额进行计算时的不准确。

    也就是说,当可以接受时,用例是什么?那么,在做出决定时应该考虑哪些一般原则?

    7 回复  |  直到 17 年前
        1
  •  3
  •   Charlie Martin    17 年前

    我猜你这里指的是“浮点”。答案是,基本上,任何时候所涉及的数量都是近似的、测量的,而不是精确的;任何时候,所涉及的数量大于基础机器上可以方便地精确表示的数量;任何时候,对计算速度的需求超过了精确的精度;而且任何时候都可以保持适当的精度,而不存在其他复杂性。

    关于这方面的更多细节,你真的需要读一本数值分析的书。

        2
  •  3
  •   Todd Gamblin    17 年前

    浮点数应该用于它们的设计目的:在计算中需要的是一个固定值 精确 ,您只关心您的答案是否准确到一定的公差范围内。如果你在任何情况下都需要一个准确的答案,你最好使用其他方法。

    以下是三个可以使用浮点的域:

    1. 科学模拟

    2. 游戏
      把游戏想象成一个可以作弊的模拟游戏。如果物理效果“足够好”看起来是真实的,那么游戏就可以了,你可以在用户体验中弥补你在准确性方面的不足。游戏通常使用单精度浮点。

    3. 统计数据
      与科学应用程序一样,统计方法也需要大量浮点运算。许多数值方法是相同的;应用程序域完全不同。在金融应用程序中以及在分析大量调查数据的任何领域中,您都会发现大量的统计数据和蒙特卡罗模拟。

    浮点运算并不简单,对于大多数业务应用程序来说,您真的不需要了解所有这些细节。只要知道不能用浮点数精确地表示一些十进制数就可以了,而且应该确保对价格之类的东西使用一些十进制类型。

    如果你真的想进入细节,了解所有的权衡和陷阱,看看经典 What Every Programmer Should Know About Floating Point ,或拿起一本书 Numerical Analysis Applied Numerical Linear Algebra 如果你真的喜欢冒险。

        3
  •  2
  •   David Thornley    17 年前

    有必要了解一些陷阱。例如,测试两个浮点数是否相等通常不是您想要的,因为只需要一点不准确度就可以使比较不相等。tgamblin提供了一些很好的参考。

        4
  •  2
  •   Lou    17 年前

    简短的故事是,如果你需要 准确的 计算时,不要使用浮点。

    不要将浮点数用作循环索引:不要被发现执行以下操作:

    for ( d = 0.1; d < 1.0; d+=0.1) 
    {  /* Some Code... */ }
    

    你会感到惊讶的。

    不要使用浮点数作为任何类型映射的键,因为您永远无法指望像您预期的那样实现相等。

        5
  •  1
  •   cletus    17 年前

    在处理科学或统计计算时,使用浮点类型是合适的。这些数据总是只有,比如说,3-8个有效数字的准确度。

    至于是使用单精度浮点类型还是双精度浮点类型,这取决于您对精度的需要以及需要多少有效数字。通常情况下,除非有充分的理由不这样做,否则人们最终只会使用双打。

    对于涉及此类内容的计算,浮点数是合适的。

    另外,如果你在处理无理数,浮点类型是合适的(也是你唯一的选择),比如线性代数,你经常处理平方根。

    钱是不同的,因为你通常需要精确,每个数字都是重要的。

        6
  •  1
  •   David Cournapeau    17 年前

    我认为你应该问另一个问题:什么时候不应该使用浮点。对于大多数数字任务,浮点是首选的数据类型,因为您可以(几乎)忘记溢出和整数类型通常遇到的其他类型的问题。

    观察浮点数据类型的一种方法是,精度与动态无关,即数字是否非常小或非常大(当然在可接受的范围内),有意义的位数是否大致相同。

    y+x z) 。根据z、y和z的值,这可能很重要。

        7
  •  0
  •   RossFabricant    17 年前

    从…起 Wikipedia :

    浮点运算已经达到极限 当它只是用来 在一段时间内测量真实世界的量 范围广泛的鳞片(如 木卫一的轨道周期或质量 质子),在最坏的情况下 预计将对相互作用进行建模 以十进制表示的数量的集合 期望精确的字符串。

    浮点运算速度快但不精确。如果这是一个可接受的折衷方案,请使用浮点。