我的MySQL:5.6.16
我的表信息:
CREATE TABLE `xxx` ( `uid` int(11) NOT NULL, `money` float(10,2) NOT NULL DEFAULT '0.00' , `real_money` float(10,2) NOT NULL , `available_invoice` float(10,2) DEFAULT NULL, PRIMARY KEY (`uid`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;
我的表内容是:
1 100000.00 0.00 0.01 30 99992560.00 0.03 0.00 61 65216.00 0.03 0.00 79 10.00 0.00 0.00 80 10.00 0.00 0.00 81 -70.00 0.00 0.00 83 60.00 0.00 0.00 100 100.00 50.00 50.00 889 980.00 0.00 0.00 1234 99959040.00 0.00 99999.00 1239 40.00 0.00 0.00
当我执行sql时:
update `xxx` set `money`=`money`-20 where uid = 1234
结果是:
uid money real_money available_invoice 1 100000.00 0.00 0.01 30 99992560.00 0.03 0.00 61 65216.00 0.03 0.00 79 10.00 0.00 0.00 80 10.00 0.00 0.00 81 -70.00 0.00 0.00 83 60.00 0.00 0.00 100 100.00 50.00 50.00 889 980.00 0.00 0.00 1234 99959024.00 0.00 99999.00 1239 40.00 0.00 0.00
它总是错过4或2,无论我对接近100000000的浮点数加或减一些,为什么?
您的问题与浮点值有多大有关,但我不确定100%为什么。我测试了用较小的数字更新类似的行,但效果很好。您还应尽可能避免使用引号,因为这需要额外的处理。
这是我的简单解决方法,就像Tim Biegeleisen建议的那样:
CREATE TABLE `xxx` ( `uid` int(11) NOT NULL, `money` decimal(10,2) NOT NULL DEFAULT '0.00' , `real_money` float(10,2) NOT NULL , `available_invoice` float(10,2) DEFAULT NULL, PRIMARY KEY (`uid`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;
插入:
USE dbname; insert into xxx Values(1234, 99959040.00, 0.00, 99999.00);
不带字符串的更新:
update xxx set money = money - 20 where uid = 1234;
使用大浮点值进行计算时有些奇怪的事情。其中一些问题与机器有关,并且与您拥有的处理器类型有关。在此处阅读更多信息:http : //dev.mysql.com/doc/refman/5.7/en/problems-with- float.html
同样,根据另一个SO问题,浮点值不是存储货币值的好方法。浮点和十进制数据类型之间的区别(请参阅第二个答案)。
似乎使用decimal和numeric数据类型最适合mysql中的money列。
decimal
numeric