我有两张桌子。假设第一个是数字,其中user_id +某个数字(double),每个user_id可以有多行。然后我从表数字中获得了另一个用户,其中user_id(PRIMARY)+该用户所有号码的产品。
在号码中插入或删除记录时,我需要重新计算 users.product 。由于一次只插入一条记录,我可以使用此查询执行此操作:
UPDATE users SET product=product*{number} WHERE user_id={some_id}
但是当记录被批量删除时,需要一些丑陋的代码来执行此操作,只需重新计算产品就更简单了。但是,没有像PRODUCT这样的功能。我可以用
exp(sum(log(coalesce(*number*,1)))
但我不确定我是否会最终得到错误的数字产品。数字将在1.00到9.99之间。这种方式可以丢失多少精度?
答案 0 :(得分:2)
如果使用浮点表示,则问题的答案为“是”。
一般情况下,如果您将数字乘以小范围并且只有少量数字,那么这不会成为问题。如果您对此感到担心,请将数字存储在固定的十进制表示中。
您采取原木的解决方案很好。对于大多数应用来说,这将产生足够的精度。但是,如果你正在向火星发送一个轨道器,那么小的错误就会累积,你不应该依靠数据库来获得高精度的数值精度。
请注意,计算的顺序也会影响数值精度。