【问题标题】:Curious result from PHP, SQL query来自 PHP、SQL 查询的奇怪结果
【发布时间】:2018-08-21 17:43:04
【问题描述】:

我正在做一个使用数据库的实验,结果很奇怪。

系统是这样的: 我有一个按钮,每次单击它时都会向计数器添加 1。 一旦达到一定数量,就会计算扣分并更新分数

PHP:

$counter = $_POST['counter'];
$user = $_POST['user'];

$sql = "SELECT score FROM board WHERE player = '$user'";
$result = mysqli_query($con,$sql);
$row = mysqli_fetch_array($result);

if($counter == 1)
  $divisor = 0;
else if($counter == 5)
  $divisor = 0.1;
else if($counter == 20)
  $divisor = 0.3;
else if($counter == 50)
  $divisor = 1;}

$deduction = $row['score'] * $divisor;

$sql = "UPDATE board SET score = score - ".$deduction." WHERE player = '$user'";

我从 score = 10 开始 这些就是结果

Score: 10
Counter: 1

Divisor = 0; Deduction = 10 * 0;
UPDATE ... score = score - Deduction (0)
New score = 10
-------------------------------------

Score: 10
Counter: 5

Divisor = 0.1; Deduction = 10 * 0.1;
UPDATE ... score = score - Deduction (1)
New score = 9
-------------------------------------

Score: 9
Counter: 20

Divisor = 0.3; Deduction = 9 * 0.3;
UPDATE ... score = score - Deduction (2.7)
New score = 6.3
-------------------------------------

## Here is the curious part

Score: 6.3
Counter: 50

Divisor = 1; Deduction = 6.3 * 1;
UPDATE ... score = score - Deduction (6.3)
New score = 0.000000190735

知道我为什么会得到 0.000000190735 吗? 我现在有点迷茫。

B'rgrds,

【问题讨论】:

  • 这只是一个舍入误差。报告您对任何小于 7dp 的答案,它将显示为零。
  • 这是我第一次听说舍入错误。让我想到这种情况发生了多少
  • 顺便说一句,你认为这与我使用数据类型 Float 而不是 Double 有什么关系吗?

标签: php sql calculation


【解决方案1】:

评论有点长。

这无疑是由score$divisor 的不同表示或将$divisor 转换为查询字符串引起的。很难准确指出问题出在哪里,因为有几个不同的地方。

如果确实需要处理,请在数据库中进行计算:

UPDATE board
    SET score = score * (1 - ?)
    WHERE player = ?;

将占位符作为参数传递——而不是修改查询字符串。

【讨论】:

  • 嗯,让我看看结果如何,然后告诉你
  • 顺便说一句,你认为这与我使用数据类型 Float 而不是 Double 有什么关系吗?
  • @null 。 . .您的代码在 PHP 和 SQL 中将浮点数转换为整数并将浮点数转换为字符串。有很多转换。如果您遵循此答案,您将消除转换并可能得到您期望的答案。
  • 是的,实际上我刚刚发现了这一点。我尝试使用不同的类型,在大多数情况下,Decimal 似乎比 Float 和 Double 效果更好。或者至少我认为
  • @null 。 . .出于许多目的,定点表示确实更直观。
猜你喜欢
  • 2018-09-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多