我在我的MYSQL数据库中插入小数,但最终在数据库中的值是四舍五入的,尽管我已将数据库设置为DECIMAL(10,4)。例如,我将折扣设置为6.5,DB将其记录为7。
我的查询是:
$save = sprintf("
INSERT INTO discount
SET am_discount = %d,
tx_discount = '%s'
",
$_POST['am_discount'],
mysql_escape_string($_POST['tx_discount'])
);
我已尝试将am_discount
字段设置为%u
和%f
,但似乎没有任何区别。
正如我所提到的,我的MYSQL数据库中的am_discount字段设置为DECIMAL (10,4)
,我也尝试过(10,2)和(8,2)。
我错过了什么?
答案 0 :(得分:1)
尝试:
$save = sprintf("INSERT INTO discount SET am_discount = '".$_POST['am_discount']."',
tx_discount = '".mysql_escape_string($_POST['tx_discount'])."' ");
答案 1 :(得分:1)
它似乎是数据库表列属性问题,如果有人可以认可我。
请将您的表列属性更改为“Float”。
MySQL允许非标准语法:FLOAT(M,D)或REAL(M,D)或DOUBLE PRECISION(M,D)。这里,“(M,D)”表示总共可以存储最多M位的值,其中D位可以在小数点之后。例如,定义为FLOAT(7,4)的列在显示时将显示为-999.9999。 MySQL在存储值时执行舍入,因此如果将999.00009插入FLOAT(7,4)列,则近似结果为999.0001。
参考: http://dev.mysql.com/doc/refman/5.0/en/floating-point-types.html
答案 2 :(得分:1)
它不是数据库表列属性问题。十进制是正确的列类型。
对于插入DECIMAL或整数列,目标是精确的数据类型,因此舍入使用“从零开始的一半”,无论要插入的值是精确的还是近似的。
有关详细信息,请参阅http://dev.mysql.com/doc/refman/5.0/en/precision-math-rounding.html。
答案 3 :(得分:0)
实际上,这与数据库无关。这是%d的sprintf行为。
%d The argument is treated as an integer and presented as a (signed) decimal number.