mariadb 5.5.60上奇怪的零行为(double)

rfbsl7qr  于 2021-06-20  发布在  Mysql
关注(0)|答案(1)|浏览(489)

这个问题在这里已经有答案了

浮点数学坏了吗((31个答案)
mysql中存储金钱值的最佳数据类型(12个答案)
两年前关门了。
亲爱的朋友们!
我对运行在linux上的Mariadb5.5.60有一个奇怪的问题。
出于某种原因,我对difference列做了一些简单的操作,如您所见,它是一个double。

  1. CREATE TABLE IF NOT EXISTS `users` (
  2. `id` int(12) NOT NULL AUTO_INCREMENT,
  3. `email` varchar(256) DEFAULT NULL,
  4. `username` varchar(256) NOT NULL,
  5. `password` varchar(256) NOT NULL,
  6. `won` int(11) NOT NULL DEFAULT '0',
  7. `lose` int(11) NOT NULL DEFAULT '0',
  8. `difference` double NOT NULL DEFAULT '0',
  9. `available_balance` double NOT NULL DEFAULT '0',
  10. `pending_received_balance` double NOT NULL DEFAULT '0',
  11. `spawns` int(11) NOT NULL DEFAULT '0',
  12. `condicion` varchar(256) NOT NULL DEFAULT 'offline',
  13. `address` varchar(256) NOT NULL DEFAULT 'offline',
  14. `eliminado` int(12) NOT NULL DEFAULT '0',
  15. `creacion` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  16. PRIMARY KEY (`id`)
  17. ) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=latin1;

问题是:
-917.3700000000001
当系统开始加减值时,就会发生这种情况。由于这些数字代表金钱,我们不能容忍任何武断的差别。
可能导致此问题的查询之一如下:

  1. UPDATE users SET
  2. difference = difference - '$xfer->value_final',
  3. available_balance = '$user->available_balance',
  4. pending_received_balance = '$user->pending_received_balance',
  5. condicion = '$user->condicion'
  6. WHERE id = '$user->id'

如您所见,这个值被更新为减去$xfer->value\u final,在本例中是101.93。
这甚至有点难以复制,因为在得到长的零尾值之前,我必须将相同的顺序放置至少10次。
一旦该值发生一次,那么,在下一次操作中,或者在修复之前,它当然会保持满0。
这些值来自btc区块链,但是我100%确定它们上总是有2个小数,因为我总是将它们存储在另一个表中。
¿有人知道为什么会这样吗?¿这是虫子吗?¿还是我遗漏了什么?
¿我怎样才能解决这个问题?
提前感谢;克里斯

oewdyzsn

oewdyzsn1#

谢谢@amadan!
下面是我们解决问题的方法:

  1. CREATE TABLE IF NOT EXISTS `users` (
  2. `id` int(12) NOT NULL AUTO_INCREMENT,
  3. `email` varchar(256) DEFAULT NULL,
  4. `username` varchar(256) NOT NULL,
  5. `password` varchar(256) NOT NULL,
  6. `won` int(11) NOT NULL DEFAULT '0',
  7. `lose` int(11) NOT NULL DEFAULT '0',
  8. `difference` decimal(10,2) NOT NULL DEFAULT '0.00',
  9. `available_balance` decimal(10,2) NOT NULL DEFAULT '0.00',
  10. `pending_received_balance` decimal(10,2) NOT NULL DEFAULT '0.00',
  11. `spawns` int(11) NOT NULL DEFAULT '0',
  12. `condicion` varchar(256) NOT NULL DEFAULT 'offline',
  13. `address` varchar(256) NOT NULL DEFAULT 'offline',
  14. `eliminado` int(12) NOT NULL DEFAULT '0',
  15. `creacion` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  16. PRIMARY KEY (`id`)
  17. ) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=latin1;

小数点10,2已全部替换为双精度。

展开查看全部

相关问题