Mysql插入/更新不同的十进制值

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Mysql插入/更新不同的十进制值相关的知识,希望对你有一定的参考价值。

我有一个非常奇怪的情况,其中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使用“从零开始的一半圆”舍入,因此将自动舍入

对于插入DECIMAL或整数列,目标是精确数据类型,因此舍入使用“从零开始的一半”,无论要插入的值是精确的还是近似的:

Precision Math Rounding

编辑:我认为它使用了Banker的Rounding,但这给出了不同的结果。

以上是关于Mysql插入/更新不同的十进制值的主要内容,如果未能解决你的问题,请参考以下文章

(错误)SQL 代码 -530,错误外键 PAY$ID$U 的插入或更新值无效

将十六进制值插入 MySql

mysql 无数据插入,有数据更新

mysql 无数据插入,有数据更新

如何将二进制值插入mysql

mysql 批量更新与批量更新多条记录的不同值实现方法