2

我有两张桌子。假设第一个是带有 user_id + 一些数字(双)的数字,每个 user_id 可以有多行。然后我有另一个用户user_id(PRIMARY) + product of all numbers for this user from the table numbers

由于记录被插入或从数字中删除,我需要重新计算users.product。由于一次只插入一条记录,我可以使用以下查询来完成:

UPDATE users SET product=product*{number} WHERE user_id={some_id}

但是由于记录被批量删除,因此需要一些丑陋的代码才能做到这一点,重新计算产品更简单。但是,没有像 PRODUCT 这样的功能。我可以用

exp(sum(log(coalesce(*number*,1)))

但我不确定我是否会得到一个错误的数字乘积。数字将在 1.00 到 9.99 的范围内。这样会损失多少精度?

4

1 回答 1

2

如果您使用浮点表示,您的问题的答案是“是”。

一般来说,如果你在一个小范围内相乘并且只有少数几个数字,这不会成为问题。如果您对此感到担心,请以固定的十进制表示形式存储数字。

您记录日志的解决方案很好。对于大多数应用程序,这将产生足够的精度。但是,如果您致力于将轨道器发送到火星,可能会累积小错误,并且您不应该依赖数据库来获得高精度的数值精度。

请注意,计算的顺序也会影响数值精度。

于 2013-01-27T19:55:42.933 回答