我有一个非常奇怪的情况,其中mariaDB(mysql)插入(或更新)一个不同的十进制值。在下面的示例中,我想插入值“ 387507.65”,但在mysql中将其注册为“ 387507.66”。如果我使用不同的金额,比如说不带“ 3”,则表示已被罚款。

举个例子:

CREATE TABLE IF NOT EXISTS tbltest (
  ID int(11) NOT NULL AUTO_INCREMENT,
  admin_id int(11) NOT NULL DEFAULT '0',
  opening_balance float(11,2) NOT NULL DEFAULT '0.00',
  PRIMARY KEY (ID)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;

INSERT INTO tbltest (ID, admin_id, opening_balance) VALUES (NULL,'1','387507.65');


我经过测试
5.5.52-MariaDB(Linux)
10.1.26-MariaDB(Linux)

我必须怎么做才能插入正确的值387507.65?

最佳答案

对于FLOAT类型,MySQL在浮点数的有效位数(分数部分)中最多使用24位。使用这种格式时,不能完全表示387507.65。两个最接近的值是387507.625和387507.65625。由于后者更接近387507.65,因此MySQL会使用它。

然后,当在小数点后打印两位小数的387507.65625时,将四舍五入为387507.66。

如果要精确存储387507.65,则可以使用DECIMAL类型。 (请注意,尽管有些人将十进制浮点数描述为“精确”,但这是不正确的。如果十进制浮点数的有效位数不太多,则它们可以精确存储十进制数字,但通常不能精确计算。)最可能的输入值,加法,乘法,除法和减法的基本运算将返回舍入结果,而不是精确结果。)

如果要以更精确的近似值存储387507.65,但又不需要精确度,则可以使用DOUBLE。

如果无法使用FLOAT更改数据库,则无法更精确地存储387507.65。

关于mysql - MySQL插入/更新不同的十进制值,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/49024998/

10-10 14:51