【问题标题】:MySQL DECIMAL handling in PHPPHP中的MySQL DECIMAL处理
【发布时间】:2012-01-13 10:57:14
【问题描述】:

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

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

【问题讨论】:

  • 我们现在在将 MySQL 查询输入数据库时​​进行所有计算。仍然存在一些不精确性,所以问题可能出在其他地方,但我猜这是另一个问题..

标签: php mysql floating-point decimal precision


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    您可以尝试使用任意精度功能:

    http://php.net/manual/en/book.bc.php

    您的另一个选择是将值存储为 INT,然后在需要显示时转换它们(即除以 10)。

    【讨论】:

      猜你喜欢
      • 2013-01-04
      • 2013-06-07
      • 2011-10-13
      • 1970-01-01
      • 1970-01-01
      • 2012-08-14
      • 2011-07-30
      • 2012-09-21
      • 2011-06-27
      相关资源
      最近更新 更多