MariaDB 5.5.60上的怪异零行为(double)

时间:2018-08-23 03:45:15

标签: mysql double decimal mariadb precision

SO的亲爱的朋友!

我在Linux上运行的 MariaDB 5.5.60遇到了一个奇怪的问题。

由于某种原因,我正在使用差异列进行简单的操作,如您所见,它是两倍。

CREATE TABLE IF NOT EXISTS `users` (
  `id` int(12) NOT NULL AUTO_INCREMENT,
  `email` varchar(256) DEFAULT NULL,
  `username` varchar(256) NOT NULL,
  `password` varchar(256) NOT NULL,
  `won` int(11) NOT NULL DEFAULT '0',
  `lose` int(11) NOT NULL DEFAULT '0',
  `difference` double NOT NULL DEFAULT '0',
  `available_balance` double NOT NULL DEFAULT '0',
  `pending_received_balance` double NOT NULL DEFAULT '0',
  `spawns` int(11) NOT NULL DEFAULT '0',
  `condicion` varchar(256) NOT NULL DEFAULT 'offline',
  `address` varchar(256) NOT NULL DEFAULT 'offline',
  `eliminado` int(12) NOT NULL DEFAULT '0',
  `creacion` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=latin1;

问题:

  

-917.3700000000001

当系统开始增加和减少值时会发生这种情况。由于这些数字代表金钱,因此我们不能容忍任何随意的差异。

可能导致此问题的查询之一如下:

    UPDATE users SET
    difference                  = difference - '$xfer->value_final',
    available_balance           = '$user->available_balance',
    pending_received_balance    = '$user->pending_received_balance',
    condicion                   = '$user->condicion'
    WHERE id                    = '$user->id'

如您所见,该值正在更新以减去$ xfer-> value_final,在本例中为 101.93

很难复制,因为在获得长零尾值之前,我必须将相同顺序至少下达10次。

一旦该值发生一次,那么对于下一次操作或直到固定该值,它当然将保持为零。

此值来自BTC区块链,但是我100%肯定它们上总是有2个小数,因为我总是将它们存储在另一个表中。

¿有人知道为什么会这样吗?这是一个错误吗? ¿或者我想念什么吗?

¿我该如何解决?

预先感谢; 克里斯

1 个答案:

答案 0 :(得分:0)

感谢@Amadan!

这是我们的解决方法:

CREATE TABLE IF NOT EXISTS `users` (
  `id` int(12) NOT NULL AUTO_INCREMENT,
  `email` varchar(256) DEFAULT NULL,
  `username` varchar(256) NOT NULL,
  `password` varchar(256) NOT NULL,
  `won` int(11) NOT NULL DEFAULT '0',
  `lose` int(11) NOT NULL DEFAULT '0',
  `difference` decimal(10,2) NOT NULL DEFAULT '0.00',
  `available_balance` decimal(10,2) NOT NULL DEFAULT '0.00',
  `pending_received_balance` decimal(10,2) NOT NULL DEFAULT '0.00',
  `spawns` int(11) NOT NULL DEFAULT '0',
  `condicion` varchar(256) NOT NULL DEFAULT 'offline',
  `address` varchar(256) NOT NULL DEFAULT 'offline',
  `eliminado` int(12) NOT NULL DEFAULT '0',
  `creacion` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=latin1;

所有双打均已替换为小数10,2