回答

收藏

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

技术问答 技术问答 410 人阅读 | 0 人回复 | 2023-09-12

我的MySQL:5.6.163 ^7 @0 }5 ]0 F9 V1 ]
我的表信息:
0 l6 g* a5 x0 i/ w. U8 N3 WCREATE 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;我的表内容是:# a# r" D* [4 v" d9 }, y
1    100000.00     .00    0.0130   99992560.00    0.03    0.0061   65216.00000       0000000      .03    0.0079   10.00000          000000         .00    0.0080   10.00000          000000         .00    0.0081   -70.0000        00000    .00    0.0083   60.00000          000000         .00    0.00100  100.0000       50005005005000           5000500505005005005005005005005005005005005005000                          .00   50.00889  980.0000        00000    .00    0.001234 99959040.00    0.00    99999.001239 40.00000          000000         .00    0.00当我执行sql时:
- q/ j# k& D2 G+ |  P3 n0 uupdate `xxx` set `money`=`money`-20 where uid = 1234结果是:! P2 R& I$ t/ A, G5 J- j* a
uid  money          real_money available_invoice1    100000.00      0.00    0.0130   99992560.00    0.03    0.0061   65216.00000       0000000      .03    0.0079   10.00000          000000         .00    0.0080   10.00000          000000         .00    0.0081   -70.0000        00000    .00    0.0083   60.00000          000000         .00    0.00100  100.0000       50005005005000           5000500505005005005005005005005005005005005005000                          .00   50.00889  980.0000        00000    .00    0.001234 99959024.00    0.00    99999.001239 40.00000          000000         .00    0.00它总是错过4或2,不管我增加或减少近1万个浮点,为什么?
. k+ a) U! B: m5 Y. c9 G8 w1 E                                                               
% V6 E; p" }2 Y( x( K4 S    解决方案:                                                               
4 w% _5 m2 J  s9 F                                                                你的问题和浮点值有多大关系,但我不确定100%为什么?我测试过用较小的数字更新类似的行,但效果很好。由于需要额外处理,您也应尽量避免使用引号。
) F1 ]- @# d, q( P, D+ Q' p( V这是我简单的解决方案,就像Tim Biegeleisen建议如下:
* k. s0 D$ Z6 a3 |- _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;插入:% o) M! a9 V" \7 T4 `+ M9 O3 I
USE dbname;insert into xxx Values(1234,99959040.00,0.00,99999.00);不带字符串的更新:
! _; V' }) [; F* Vupdate xxx set money = money - 20 where uid = 1234;计算大浮点值时有一些奇怪的事情。有些问题与机器和处理器类型有关。在这里阅读更多信息:http : //dev.mysql.com/doc/refman/5.7/en/problems-with-
  q3 m5 u! ~3 Sfloat.html
6 T5 E% z% ^7 Z0 P( p: m同样,根据另一个SO浮点值不是存储货币值的好方法。浮点与十进制数据类型的区别(请参考第二个答案)。
3 p$ t5 z" G. M3 R2 J; \* |  U似乎使用decimal和numeric最适合数据类型mysql中的money列。
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则