为什么两个看似相同的变量产生两种不同的结果?

时间:2014-07-27 17:18:04

标签: php

我试图写一些代码来加入板球比赛。板球的数量超过0.1,0.2,0.3,0.4,0.5,1.0,1.1等,因此只是以标准方式将小数加在一起并不起作用。

我已按照此主题中提供的建议 - Php: when a number gets to 0.6 make it 1进行实际转换,并且当我将一个随机数输入等式时,它会按预期返回。但是,当我使用我从数据库生成的数字时,它不会返回相同的内容。

我试图创建一些示例代码和输出来进一步解释问题。在这个例子中,变量$ xb等于1.2,你将在输出中看到。

代码:

echo "Var type - " . gettype($xb) . ' Value = ' . $xb . '<br />';
echo "Var type - " . gettype(1.2) . ' Value = 1.2<br />';

$overs = floor((1.2 * 10) / 6);
$balls = (1.2 * 10) - ($overs * 6);

$x_overs = floor(($xb * 10) / 6);
$x_balls = ($xb * 10) - ($x_overs * 6);

echo "Total overs = " . $overs . '.' . $balls . "<br />";
echo "Total x overs = " . $x_overs . '.' . $x_balls . "<br />";

输出:

Var type - double Value = 1.2
Var type - double Value = 1.2
Total overs = 2.0
Total x overs = 1.6

我确定我必须做一些根本上愚蠢的事情或误解一些基本的东西,但我已经盯着它看了一个小时而且看不到它。有人能把我的痛苦告诉我吗?

3 个答案:

答案 0 :(得分:3)

我建议使用两种格式,一种用于显示,一种用于处理。您需要例程来在两种格式之间进行转换。

在处理格式中,我建议将单位乘以6并将其加到十分之一处。所以“1.0”将是6,“1.1”将是7,依此类推。这样,您可以轻松地处理处理格式的数字,根据需要添加和减去它们。你可以将这些数字作为整数来操纵,因此没有可能浮点舍入弄乱你。

从处理格式转换为显示格式,使用整数除法除以6。结果是单位放置,其余的是十分之一。因此8除以6是1余数2.因此内部值8对应于显示值“1.2”。

答案 1 :(得分:2)

双算术是inherently inaccurate。对于这种操作,我建议你使用整数。

现在,我怀疑你有十进制数,每次需要增加值时增加0.1。由于0.1不能准确地表示为基数2浮点值,因此1.2实际上不是1.2,它的值略逊于此值,但它足够接近PHP选择的值在显示时将其展开。您可以轻松地验证此假设:$xb < 1.2

而不是将数字存储为0.1,0.2,0.3,0.4,0.5,1.0 ......(其中只有1.0可以精确地表示为双,而你赢了按照编号约定,通过添加0.1 10次或甚至6次来得到1,你应该增加一个整数并格式化:

$x = 8;
echo floor($x / 6) . "." . ($x % 6);

我不知道板球如何运作,但是如果你需要添加一个原始的,你可以添加6.如果你需要&#34;围绕&#34;过了,你可以去下一个六的倍数。

答案 2 :(得分:0)

如果没有错误分析,请不要对数学上是不连续点的值(此处为floor on 2)使用不连续函数,例如floor。因此,要么进行错误分析,那么你可以纠正不连续函数的参数,例如: floor(x+0.01)代替floor(x),或使用精确算术(整数,有理数)。