PHP中计算值与数据库中插入的相同值之间的差异[已关闭]

w8biq8rn  于 2023-02-15  发布在  PHP
关注(0)|答案(1)|浏览(123)

这个问题是由打字错误或无法再重现的问题引起的。虽然类似的问题在这里可能是on-topic,但这个问题的解决方式不太可能帮助未来的读者。
8小时前关门了。
Improve this question
我遇到了一个非常奇怪的问题。我正在开发一个自定义WordPress插件,我有一个数据库表,其中有一个名为pending_balance的列,这是一个decimal(8,8)数据类型。另一方面,我有这样的代码(这实际上是一个cron作业):

if ( ! empty( $subscriptions ) ) {
      foreach ( $subscriptions as $subscription ) {
        if($subscription->status != "inactive") {

          // Calculating $new_pending_balance

          error_log($algorithm . " - " . $new_pending_balance . PHP_EOL, 3, WCM_PLUGIN_DIR . 'error.log');

          $wpdb->update(
              $table_name,
              array( 'pending_balance' => $new_pending_balance ),
              array( 'id' => $subscription->id ),
              array( '%f' ),
              array( '%d' )
          );
        }
      }
    }

当cron作业运行时,我可以清楚地看到error.log中的新日志。

bitcoin - 0.00038531
litecoin - 0.10420367
ethereumclassic - 1.27727247

当我打开数据库表以便查看ethereumclassic的新待定余额时,显示为0.99999999而不是1.27727247。我尝试了许多方法,例如将$new_pending_balance转换为100%完全相同的数据类型,我尝试过在$wpdb上执行RAW查询,而不是使用->update()方法。我还没有尝试过将列的数据类型改为string,这样就不会有问题了,但是我担心这样做是因为在插件内部的任何地方,计算都是从数据库中检索的纯值,而我现在实际上是从数据库中检索浮点数。如果我把它变成字符串可能会引起错误。我该怎么办,伙计们?

efzxgjgh

efzxgjgh1#

DECIMAL(8,8)意味着可以存储8位数字,其中8位是小数,这样1.27727247中就没有你的1了;列可以存储从-0.999999990.99999999的值。
https://dev.mysql.com/doc/refman/8.0/en/fixed-point-types.html
标准SQL要求DECIMAL(5,2)能够存储任何五位数和两位小数的值,因此可以存储在salary列中的值的范围是-999.99到999.99。
您应该考虑打开MySQL的“严格模式”,这会给您一个“超出范围”的错误,而不是默默地转换值。

相关问题