一尘不染

当我将xx添加到mysql float列时,结果错误,这是错误吗?

sql

我的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的浮点数加或减一些,为什么?


阅读 122

收藏
2021-05-30

共1个答案

一尘不染

您的问题与浮点值有多大有关,但我不确定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问题,浮点值不是存储货币值的好方法。浮点和十进制数据类型之间的区别(请参阅第二个答案)。

似乎使用decimalnumeric数据类型最适合mysql中的money列。

2021-05-30