【问题标题】:PHP MYSQL saving float in database 0.01?PHP MYSQL 在数据库 0.01 中保存浮点数?
【发布时间】:2019-05-26 09:06:06
【问题描述】:

我正在尝试将 MySql 表中的美分数保存为浮点数,但数据库错误,例如我保存 0.01,它保存为 0.1!

有可能实现吗?

我的代码;

$return["reward"] = 0.05;

$api->user['balance']  += $return["reward"];

$q = $api->pdo->prepare("UPDATE " . DB_PREFIX . "user
                         SET 
                         balance = :balance
                         WHERE 
                         userid = :userid");

$q->bindParam(":balance" , $api->user['balance']  , PDO::PARAM_INT );
$q->bindParam(":userid" , $api->user['userid'] , PDO::PARAM_INT); 

balance 列 TYPE 在数据库中浮动。

【问题讨论】:

  • balance 列有什么类型?
  • @MaximFedorov 类型的浮点数
  • 使用 PDO::PARAM_INT 将使用整数保存它,所以不确定它是如何输出为 0.1 的。我本来希望是 0 或 1。
  • 正如@Curious_Mind 所说,您应该使用PDO::PARAM_STR,查看此帖子:stackoverflow.com/questions/2718628/pdoparam-for-type-decimal 也许您的数据库配置错误?
  • 我确实把它改成了PDO::PARAM_STR 还是一样

标签: php mysql


【解决方案1】:

此故障与您的代码无关。

您使用的数据类型 float 不应用于存储货币值。

将您的数据类型更改为decimal,这被认为是存储货币值的最佳做法。

您可以通过 phpMyAdmin 的网络界面或使用如下查询来更改它:

ALTER TABLE tablename MODIFY columnname DECIMAL(5,2);

这将允许您在逗号之前存储 5 个数字,在逗号之后存储 2 个数字,根据您的需要进行更改。

【讨论】:

【解决方案2】:

尝试将列类型更改为十进制并将 Length 设置为 7.2 。这将是点之前的七个数字和点之后的两个数字

【讨论】:

    【解决方案3】:

    尝试使用PDO::PARAM_STR 而不是PDO::PARAM_INT

    $q->bindParam(":balance" , $return["reward"]  , PDO::PARAM_STR);
    

    来自Documentation

    MySQL 允许使用非标准语法:FLOAT(M,D) 或 REAL(M,D) 或 DOUBLE 精度(M,D)。在这里,(M,D) 表示值最多可以存储 共 M 位,其中 D 位可能在小数点后。 例如,定义为 FLOAT(7,4) 的列将类似于 -999.9999 显示时。 MySQL 在存储值时执行舍入,所以如果你 将 999.00009 插入 FLOAT(7,4) 列,近似结果为 999.0001

    另见https://dev.mysql.com/doc/refman/5.5/en/problems-with-float.html

    【讨论】:

    • 那和PDO无关,是你的db列问题
    • db 列类型设置为 Float ,我试过双倍也一样 XD
    • 是的,我认为和 Curious_Mind 一样。数据库中有问题;)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-29
    • 1970-01-01
    • 1970-01-01
    • 2011-04-01
    • 2012-05-28
    相关资源
    最近更新 更多