【问题标题】:SUM - why i get different sum when i use sum and use calculator)? [duplicate]SUM - 为什么我在使用 sum 和使用计算器时得到不同的总和)? [复制]
【发布时间】:2013-02-04 17:50:03
【问题描述】:

下午好。

注意到现场计算金额的奇怪之处。

价值表:

类型字段 - 浮点数。

我选择总和:

SELECT SUM(cost) as cost FROM Table

结果我得到sum = 20.47497010231018;

我使用计算器)我得到sum = 20,47497

请告诉我为什么我会得到不同的结果?

【问题讨论】:

  • 是的,基本上这是一个浮点常见问题。不要在 mysql 中使用 float 作为类型,您还有其他数据类型可以解决问题。
  • @Sebas 请告诉我更多,什么类型的字段可以代替浮动?
  • 是时候阅读“每个计算机科学家都应该了解的浮点运算知识”download.oracle.com/docs/cd/E19957-01/806-3568/…
  • 这两个数字几乎相同(假设您的计算器使用的是欧洲格式,而您的 MySql 是美国格式)。为什么称它们为“非常不同”?还是只是格式问题?
  • @Loki,这取决于您在该列中存储的内容的商业意义。 (钱...)

标签: mysql sql


【解决方案1】:

在这里,阅读:http://floating-point-gui.de/

所以,问题在于浮点数 - 硬件中十进制数的内部实现,并且被大多数语言和应用程序使用,不会像我们使用的那样将 1 到 1 映射到以 10 为底的数字。基础值以 2 为基数表示,并且具有有限的精度。一些可以用十进制表示法中的几个数字表示的数字实际上可能需要更多的原生格式的数字 - 导致舍入错误。

上面链接的文章详细解释了它。

【讨论】:

  • 感谢我的新知识)
【解决方案2】:

使用DECIMAL(16, 4)(例如)输入您的货币列,其中4. 之后的位数

您将不得不修剪尾随零,因为例如10 将出现10.0000。然而,这很容易做到。

【讨论】:

  • 是的,我已经使用 Decimal(10,4)。谢谢。
【解决方案3】:

在大多数情况下,这些差异不足以担心。

由于位数和浮点数以二进制形式存储的方式,浮点数因与预期值略有偏差而臭名昭著。例如,如here 所示,十进制值0.1 的实际double 值为0.10000000149011612。接近,但不准确。

我在一些需要绝对准确的纬度和经度数字的应用程序中看到使用的一种技术是,它们会将值保留为整数数据类型,这些数据类型相当于浮点数乘以 10 的某个幂。例如, GeoPoint in the Google Maps API v1 on Android 以微度为单位。而不是像54.123428, 60.809234 这样的纬度和经度来精确地保存值,它们将是整数:54123428, 60809234。为了描述这一点,他们会调用变量latitudeE6longitudeE6 来表示它是真正的纬度或经度乘以1E6(科学记数法10^6)。

【讨论】:

  • 也感谢我的新知识)
猜你喜欢
  • 2018-10-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-16
  • 2014-09-21
  • 2023-02-16
  • 1970-01-01
相关资源
最近更新 更多