插入DB后,十进制被舍入

时间:2017-04-20 09:04:49

标签: php mysql insert decimal rounding

我在使用PHP将十进制数插入MySQL时遇到了问题。 该数字的格式为货币,存储在会话变量中。

$_SESSION['total'];

使用number_format用逗号替换点可以得到正确的输出:

$amount= number_format((float)$_SESSION['total'], 2, ",", '');
echo $amount;
//output = 2,85

现在我需要将变量$ amount插入数据库,这样做:

$query = "INSERT INTO testtable VALUES" . "('$amount', 'NULL')";
$result = $con->query($query);

插入后,插入的数字为" 2,00"而不是" 2,85"。我也尝试过没有number_format但我得到相同的结果。

该行设置为十进制(10,2)。

变量echo是如何正确的,但是插入是否可以使它循环?

3 个答案:

答案 0 :(得分:1)

number_format()的输出是一个字符串,问题是MySQL / php不知道逗号,作为小数分隔符,所以你的字符串2,85被强制转换为一个数字使用字符串中有效数字字符的第一个字符。

您应该在执行任何计算或数据库插入之前将字符串转换为实数,方法是将,替换为.并将其转换为浮点数:

$number = (float) str_replace(',', '.', $amount);

如果你的会话变量包含实际数字而不是字符串,你应该直接使用它们。

请注意,使用浮动可能会导致精度问题/舍入错误。如果是这种情况,你应该只使用整数(例如,数量为美分,因此285而不是2.85)。

答案 1 :(得分:0)

您需要使用点分隔符而不是逗号进行插入。

$amount = number_format((float)$_SESSION['total'], 2, ".", '');
echo $amount; // prints 2.85
$query = "INSERT INTO money (total,second_field) VALUES" . "($amount, 'NULL')";
$result = $conn->query($query);

答案 2 :(得分:0)

我们使用number_format()为用户提供方便的用户可读性。在声明中 $ amount = number_format((float)$ _ SESSION ['total'],2,“,”,''); $ amount是字符串,将字符串插入带有十进制类型的mysql字段会插入带警告的记录

  

插入1行。警告:#1265列的数据被截断   第1行的'decimal_test'

您可以使用str_replace删除数字中的“,”并将值插入mysql表,如下所示

$_SESSION['total'] = "2,85";
$total_in_decimal = str_replace(',', '.', $_SESSION['total']);
$query = "INSERT INTO testtable VALUES" . "('$total_in_decimal', 'NULL')";
$result = $con->query($query);