当前位置: 首页 > 知识库问答 >
问题:

MariaDB 5.5.60上奇怪的零行为(双精度)[重复]

司英飙
2023-03-14

亲爱的SO朋友们!

我有一个奇怪的问题与MariaDB 5.5.60运行在linux上。

出于某种原因,我正在对差异列进行简单的操作,正如您所看到的,它是一个双倍的。

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-

这甚至有点难以复制,因为在得到长零尾值之前,我必须将相同的顺序放置至少10次。

一旦该值发生一次,那么,它当然会在下一次操作中保持满零,或者直到修复为止。

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

有人知道为什么会这样吗?这是虫子吗?还是我遗漏了什么?

我怎样才能解决这个问题?

提前感谢;克里斯

共有1个答案

秦昂然
2023-03-14

谢谢@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的所有双打都被替换了。

 类似资料:
  • 问题内容: 当我使用双精度数在Java中将317除以219时,得到1。 例如: 输出为:1。 这是因为它是重复的小数吗?不得不使用BigDecimal代替,这很烦人。 问题答案: 试试这个 java中编码数字的默认类型是,因此使用现有的代码,java正在使用两个数字,并且除法的结果也将是,这将截断小数部分以得出最终结果。然后将此结果从转换为,而没有编译器警告,因为它是 扩大的转换 (保证源类型“适

  • 问题内容: 我了解由于数值误差(例如,以不同顺序对浮点求和),在数学上等效的算术运算如何导致不同的结果。 但是,令我惊讶的是,将零加到可以更改结果。我认为无论哪种情况,这对于浮动广告始终有效。 这是一个例子。我希望所有行都完全为零。有人可以解释为什么会这样吗? 和的较小值似乎不会发生Z。 我也确定。 这是另一个示例,它还演示了python的内置行为符合预期: 我正在使用numpy V1.9.2。

  • 问题内容: 我有一些带有一些整数的PHP代码,并且一切正常,除非我拥有或作为整数。当我引用它们时,一切都很好。 示例编号: 谁能告诉我背后的原因? 问题答案: 如果您只写08和09(不带引号)或任何其他带有前导0的数字,则PHP认为您正在写一个八进制值,而08和09是无效的八进制数。 http://www.php.net/manual/zh/language.types.integer.php 句

  • null 结果将是0xFFFFFFFFFFFFFFFF0000(正确,寄存器溢出,但我们只更改2字节) 结果将为0x00000000000000000000(WTF?,寄存器溢出,但结果更改所有8个字节而不是4个字节。为什么是0x00000000000000,而不是0xFFFFFF00000000)

  • 我有以下代码来解析一个JSON文件: 要处理以下JSON文件: 如果我执行此代码,我将收到以下错误: 所以我开始一步一步地调试应用程序,看看part processing()中的哪个代码部分抛出了这个异常。令人惊讶的是,那里的所有代码都正常执行:没有抛出异常,也没有返回结果I except。 更让我惊讶的是,当我稍微改变第一种方法的代码时,它可以在不产生异常的情况下工作。 我不知道println方

  • 问题内容: 我有一些这样的代码: 我基本上希望将来避免除以零的异常。 谢谢 问题答案: 如果未显式初始化,则类范围内的数字基元将初始化为零。 必须显式初始化局部范围内的数字基元(方法中的变量)。 如果您只担心被零例外除,那么检查双精度数是否不 完全 为零非常有用。 否则, 当检查浮点值是否为或时为0时,将使用错误阈值来检测该值是否接近0,但不 完全为 0。