SUM - 当我使用sum并使用计算器时,为什么我得到不同的总和)?

时间:2013-02-19 21:30:35

标签: mysql sql

下午好。

注意到计算现场数量时的陌生感。

Vaues表:

Vaues table

输入字段 - 浮动。

我选择总和:

SELECT SUM(cost) as cost FROM Table

结果我得到sum = 20.47497010231018;

sum result

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

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

3 个答案:

答案 0 :(得分:1)

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

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

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

答案 1 :(得分:1)

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

由于位数和浮点数以二进制形式存储的方式,浮点数因略微偏离预期值而臭名昭着。例如,正如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的科学记数法)。

答案 2 :(得分:1)

对您的货币列使用DECIMAL(16, 4)(例如)类型,其中4.

之后的位数

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