php - PHP 中的 MySQL DECIMAL 处理

标签 php mysql floating-point decimal precision

正如通常讨论的那样,(例如此处 Storing 0.00001 in MySQL)DECIMAL 数据类型应该用于需要精度/正确性的字段,例如帐户余额。

但是我想知道,PHP 如何处理这些值,如果它们在内部作为 float 处理,从数据库读取这些值、进行一些计算并再次将它们写回时是否仍然存在问题。如果是这样,我们如何才能强制 PHP 保持精确度?

最佳答案

该变量最初在 PHP 中可能是一个字符串(当从 MySQL 结果对象读取时)。通常,不能依赖 PHP 的 float 据类型来保持所需的精确十进制值。您应该使用任意精度的数学库,例如 GMP . (当您获取结果对象的一行时,将 DECIMAL 列值传递给适当的构造函数,然后使用您正在使用的库提供的函数对其进行操作。)

更深入:假设您在数据库中的 DECIMAL(6, 4) 列中存储了一个金额。你想把它提取到 PHP 中,用它做一些事情。您发出查询以获取该列。您将查询的第一行提取到关联数组中。假设该行的值为 2.5674。您的数组现在类似于 array('MyDecimal' => '2.5674')(数字显示为字符串)。您使用(据我所知)gmp_init() 将该字符串转换为 GMP 资源。现在您可以使用其他 GMP 函数对该数字进行数学计算。如果你想存储一个 GMP 编号,你可以使用 gmp_strval() 将它转换回字符串(如果你正在使用可以处理 GMP 资源的数据库抽象层,也许你不必这样做) .

关于php - PHP 中的 MySQL DECIMAL 处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8849484/

相关文章:

math - float 学有问题吗?

php - PDO 语句的参数编号无效

php - Eloquent 中的 If request is not null 语句

php - 如何修复:PDOStatement::execute() 期望参数 1 为数组,在第 64 行 C:\wamp64\www\invoiceTem01-Create.php 中给出的字符串

php - MySQL - 如何从最小/最大值获取最小/最大日期

mysql - rails 2.3.8 : Errors in fetching records since MySQL is case-insensitive and Rails is case-sensitive

mysql - 开始按特定行条件进行查询

mysql - 如何删除列中位于两个确切单词之间的单词

c# - -10 在 1.5 × 10^-45 和 3.4 × 10^38 之间吗?

python - 为什么我不能将 str 列表转换为 float 列表?