下午好。
注意到在现场计算金额的奇怪之处。
价值表:
类型字段 - 浮动。
我选择总和:
SELECT SUM(cost) as cost FROM Table
结果我得到sum
= 20.47497010231018;
我使用计算器),我得到sum
= 20,47497
请告诉我为什么我会得到不同的结果?
在这里,阅读:http: //floating-point-gui.de/
所以,问题是浮点数——硬件中十进制数的内部实现,被大多数语言和应用程序使用,不会像我们使用的那样将 1 到 1 映射到以 10 为底的数字。基础值以 2 为基数表示,并且具有有限的精度。一些可以用十进制表示法中的几个数字表示的数字实际上可能需要更多的原生格式的数字 - 导致舍入错误。
上面链接的文章详细解释了它。
在大多数情况下,这些差异不足以让人担心。
由于位数和浮点数如何以二进制形式存储,浮点数因与预期值略有偏差而臭名昭著。例如,如此处所示,十进制值0.1
的实际double
值为0.10000000149011612
。接近,但不准确。
我在一些需要绝对准确的纬度和经度数字的应用程序中看到的一种技术是,它们会将值保留在整数数据类型中,这些值相当于浮点数乘以 10 的某个幂。例如,GeoPoint 在Android 上的 Google Maps API v1以微度为单位。而不是像纬度和经度那样54.123428, 60.809234
精确地保留值,它们将是 ints: 54123428, 60809234
。为了描述这一点,他们会调用变量latitudeE6
并longitudeE6
表示它是真正的纬度或经度乘以 1E6(科学记数法 10^6)。
使用DECIMAL(16, 4)
(例如)类型作为您的货币列,其中4
是后面的位数.
不过,您将不得不修剪尾随零,因为例如10
会出现10.0000
. 然而,这很容易做到。