当我将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列。 |
|
|
|
|
|