0

拥有一个 PHP 脚本 - 使用所有正确的 bcmath 函数,并完全理解浮点数的问题。我也在使用小数列,因为我的印象是,它们被存储为不同的类型,并且数学更好。

所以我有一个查询: INSERT INTO mytable (identifier, amount) VALUES ('identifer', 'some_number') ON DUPLICATE KEY UPDATE amount = amount + some_number;

基本上 - 如果我们没有一行,插入它,如果有,添加 some_number。

some_number 列是十进制(24,8)

当 some_number 等于 72100312.72872099 并且当前行在 0.00000000 处归零时运行此命令,数学以列为 72100312.72872100 结束。

如果 some_number 是 72100312.72872098 它工作正常。如果是 72100312.72872101 就可以了。如果我这样做 11111111.72872099 很好。

如果当前行不为零,而是 0.00000005,则 72100312.72872099 加得很好,总数为 72100312.72872104,如预期的那样。

这就像它搞砸了一些数学。我认为十进制列对此免疫。

有没有办法解决这个问题,或者以更好的方式进行更新?我真的宁愿不必进行选择、bcadd 和更新。这种类型的行(在重复更新时插入)在代码中出现了大约 120 次。对 select/bcadd/update 进行了很多改造。

附录:只需阅读 5.0 之前的 MySQL 服务器转换为浮点数进行数学运算。我是5.5。它不是 < 5.0 的问题。

Edit2:客户端版本是 mysqlnd 5.0.11 - 不确定这是否是问题的一部分?服务器应该做数学,对吗?

4

0 回答 0