我无法获得两个相同的浮点值来匹配。该脚本背后的基础是我查询API以获取收入,如果我的MySQL数据库中不存在该记录,则创建它,但如果它存在,请查找更改,然后更新或跳过记录。
我们以一条记录为例。收入数字为51.02,这被迫成为一个浮动数据,然后保存在数据库中。数据库列类型为float。
当我第二次查询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)"
有人有什么想法吗?浮动比较与其他比较不同吗?
提前致谢。
答案 0 :(得分: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
答案 1 :(得分:0)
将浮点文字转换为PHP的内部表示是有损的。从PHP的内部表示到MySQL使用的表示的转换可能再次是有损的。
不要比较浮点值是否相等。