This question already has answers here:
Is floating point math broken?
(31个答案)
Best data type to store money values in MySQL
(12个答案)
2年前关闭。
尊敬的SO朋友们!
我在Linux上运行的MariaDB 5.5.60遇到了一个奇怪的问题。
由于某种原因,我正在对差分列进行简单的操作,如您所见,它是一倍。
问题:
-917.3700000000001
当系统开始增加和减少值时,就会发生这种情况。由于这些数字代表金钱,因此我们不能容忍任何随意的差异。
可能导致此问题的查询之一如下:
如您所见,该值正在更新以减去$ xfer-> value_final,在这种情况下为101.93。
复制甚至有点困难,因为在获得长零尾值之前,我必须至少下达10次相同的顺序。
一旦该值发生一次,那么接下来的每次操作当然将保持零,直到固定。
这个值来自BTC区块链,但是我100%肯定它们上总是有2个小数,因为我总是将它们存储在另一个表中。
¿有人知道为什么会这样吗?这是一个错误吗? ¿或者我想念什么吗?
¿我该如何解决?
提前致谢;
克里斯
所有双打均已替换为小数10,2。
(31个答案)
Best data type to store money values in MySQL
(12个答案)
2年前关闭。
尊敬的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个小数,因为我总是将它们存储在另一个表中。
¿有人知道为什么会这样吗?这是一个错误吗? ¿或者我想念什么吗?
¿我该如何解决?
提前致谢;
克里斯
最佳答案
谢谢@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。
关于mysql - MariaDB 5.5.60上的奇怪零行为( double ),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/51978044/