【问题标题】:Mysql calculation issues: 1+1=1.999999999mysql计算问题:1+1=1.999999999
【发布时间】:2010-11-15 05:15:42
【问题描述】:

问题是这样的,当我从一个表中添加两个或多个双精度数到一个视图时,它并没有给我正确的结果,而是增加了大约十个左右的数字。例如 0.5+1.5=1.99999999998 或 5.5+8.5=14.0000000001。有任何想法吗? (我知道这是一个 n00b 问题,我记得在 9 年级的考试中不得不处理类似的事情,但我只是不记得我当时是怎么做到的:P)

【问题讨论】:

  • 这是标准的浮点问题。请在 [floating-point] 中搜索 100 多个类似问题。其中之一可能会对您有所帮助。
  • 我的高中数学老师告诉我们 .9999... = 1,所以我看不出你的问题是什么? :)
  • 我想解决这个问题,让它显示 2 而不是 1.9999999999...
  • @MitMaro .9999... 无限重复的 9 确实是 1。
  • @everyone: 1.99999999998(甚至 1.99999999999)不等于 1.999 ......所以整个无限十进制讨论是无关紧要的。 (不过,Jason 的数学老师是对的。)

标签: mysql decimal


【解决方案1】:

浮点数始终只是近似值。 :-) 如果精度很重要,想办法使用整数。

根据我的经验,当我使用十进制数据类型而不是浮点/双精度时,我总是得到精确的结果。

【讨论】:

    【解决方案2】:

    将 1 和 1 作为浮点数或双精度数相加不会产生除 2 之外的任何结果。

    我很难相信 0.5 + 1.5 除了 2 之外的任何结果。

    所有这些数字都可以用二进制浮点数正确表示。

    我不想说我不相信你的例子,但我不相信。 :-)

    但是,我相信您可能对 1.1 这样的数字有疑问。

    为什么?因为 1/10 原来是二进制的重复小数。

    在尝试在十进制和二进制表示之间转换浮点数时出现问题。一些数字使行程顺利,但其他数字只是近似值。


    但是,如果您的示例真的像那样工作,我不知道发生了什么,我很想知道。

    【讨论】:

    • 其实是的,这些例子只是例子。真正的问题包括来自不同表的大量 SUM,我认为它不会真正帮助发布整个过程......
    • 我知道!只有在我真正注意到它们之前,你的例子才具有真实性的味道。所以我给你+1成功的蒙蔽。您可以说 SOers 已经多次看到类似的问题,以至于我们实际上不再阅读它们了。 :-)
    【解决方案3】:

    不确定您是在寻找解释还是解决方案,但因为您已经获得了指向良好解释的指针......

    如果您需要您的数字表现得像整数,请使用整数。如果您需要有限的精度(即,对于代表金钱的字段,保留两位小数),无论如何将其存储为整数,但将其乘以您需要的任何因子 10,以便在将其放入时去掉小数数据库并在您将其拉出时除以相同。

    因此,如果您要代表一个价格为 3.99 美元的小部件,则将 399 放入 WIDGET.cost 字段。

    不知道这是否适用于您的情况。但一般的经验法则是浮点数始终只是近似值。 :-) 如果精度很重要,想办法使用整数。

    【讨论】:

      【解决方案4】:

      http://dev.mysql.com/doc/refman/5.0/en/string-functions.html#function_format

      如果这是你想要的,你可以用这种方式格式化数字吗?

      【讨论】:

        【解决方案5】:

        This article 很好地解释了这个问题。

        简而言之,非常大或非常小的浮点数都可能导致计算过程中的精度损失。

        【讨论】:

          【解决方案6】:

          在使用浮点类型时不要指望整数。

          【讨论】:

          • 我什至会说,“如果您不知道浮点类型的预期用途,请不要使用它们。”并且“跟踪便士”或“添加小数位”不是预期目的。
          猜你喜欢
          • 2012-02-09
          • 1970-01-01
          • 1970-01-01
          • 2010-12-07
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多