0

我无法让两个相同的浮点值匹配。脚本背后的基础是我查询一个 API 以获取收入,如果记录在我的 MySQL 数据库中不存在,则创建它,但如果它确实存在,则查找更改,然后更新或跳过记录。

让我们以一条记录为例。收入数字是 51.02,这被强制为浮点数,然后保存在数据库中。数据库列类型是浮点数。

当我再次查询 API 时,该记录已经存在,所以我现在检查收入数据的变化。收入数字再次为 51.02(无变化)并继续浮动。然后我将拉出存储的数字(也是一个浮点数)并且值是相同的。但是,PHP 告诉我浮点数不匹配,因此应该更新记录。为什么是这样?!

要检查的代码:

// The placeholder to notify the script that the record should be updated
// Default is false. The record does not need updating.
$update_record = false;

// This is the database record
// I'm reinforcing the fact it needs to be a float
// The second line isn't actually needed
$record = $query_for_revenue_item->row ();
$record->basket_value = (float) $record->basket_value; // 51.02

// The API query data is stored in $transaction
// Again, this line isn't actually needed but reinforces the float
$transaction['basket'] = (float) $transaction['basket']; // 51.02

// Check for changes in revenue
// At this stage both floats are the same (51.02)
if ($record->basket_value != $transaction['basket']) {
$update_record = true;
}

// If I output the result
var_dump ($update_record) // returns boolean(true)

// The full record log (output below)
echo "Change data from \""; var_dump ($record->basket_value); echo "\" to \""; var_dump ($transaction['basket']); echo "\"";

// The output
Change data from "float(51.02)" to "float(51.02)"

有人有想法么?浮动比较与其他比较不同吗?

提前致谢。

4

2 回答 2

0

就像您可以阅读手册一样,不要直接比较浮点数。而是使用epsilon.

<?php
$a = 1.23456789;
$b = 1.23456780;
$epsilon = 0.00001;

if(abs($a-$b) < $epsilon) {
    echo "true";
}

这是因为 PHP 存储在内部浮动的方式。您可以在手册中阅读它,例如。这里http://pl1.php.net/float

于 2013-10-11T10:53:10.287 回答
0

将浮点文字转换为 PHP 的内部表示是有损的。从 PHP 的内部表示到 MySQL 使用的表示的转换可能又是有损的。

不要比较浮点值是否相等。

于 2013-10-11T10:55:08.523 回答