PHP:意外的变量比较结果。可能的舍入问题

时间:2015-06-30 04:28:54

标签: php variables compare rounding

我正在使用多个付款系统,其中一些付款系统处理没有小数的付款,而其他付款系统则使用小数点。我的价格存储没有小数位,我会在必要时进行转换。我有一个支付的滑动比例,在下面的代码中定义;例如1年可购买12.99美元或5年29.99美元。当用户选择两年选项时,我的代码出错了。

下面是一些示例代码,说明了我在我的网站上遇到的问题。每当用户选择两年定价时,未定义$ years变量并抛出错误。我不知道为什么所有其他定义的年份值在测试时都会评估为真,但1999年的数字却没有。对此问题的任何想法都非常感谢。以下示例代码的输出如下:

1,错误,3,4,5,

<?php

define('year1', 1299);
define('year2', 1999);
define('year3', 2499);
define('year4', 2799);
define('year5', 2999);

$prices = array_values(array('YearOne' => 12.99, 'YearTwo' => 19.99, 'YearThree' => 24.99, 'YearFour' => 27.99, 'YearFive' => 29.99));

for ($x = 0; $x < sizeof($prices); $x++) {
$proPrice = $prices[$x] * 100;

switch ($proPrice) {
    case year1:
        $years = 1;
        break;
    case year2:
        $years = 2;
        break;
    case year3:
        $years = 3;
        break;
    case year4:
        $years = 4;
        break;
    case year5:
        $years = 5;
        break;
    default:
        $years = 'Error';
}

echo $years . ', ';
}
?>

如果我将$proPrice = $prices[$x] * 100;更改为$proPrice = round($prices[$x] * 100,0);我不再有意想不到的结果,但我想知道为什么使用圆函数对于1999的值是必要的,但没有其他的

1 个答案:

答案 0 :(得分:0)

此问题是由浮点数引起的,请参阅PHP Mannual中的大警告。

您可以使用bcmul,其效果如预期所示,请参阅以下示例:

define('year1', 1299);
define('year2', 1999);
define('year3', 2499);
define('year4', 2799);
define('year5', 2999);

$prices = array_values(array('YearOne' => 12.99, 'YearTwo' => 19.99, 'YearThree' => 24.99, 'YearFour' => 27.99, 'YearFive' => 29.99));
$length = sizeof($prices); //taking it out from loop comparison, as there is no need to get the size of array, which isn't changing.

for ($x = 0; $x < $length; $x++) {
$proPrice = bcmul($prices[$x],100);

switch ($proPrice) {
    case year1:
        $years = 1;
        break;
    case year2:
        $years = 2;
        break;
    case year3:
        $years = 3;
        break;
    case year4:
        $years = 4;
        break;
    case year5:
        $years = 5;
        break;
    default:
        $years = 'Error';
}

echo $years . ', ';
}