我正在使用多个付款系统,其中一些付款系统处理没有小数的付款,而其他付款系统则使用小数点。我的价格存储没有小数位,我会在必要时进行转换。我有一个支付的滑动比例,在下面的代码中定义;例如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的值是必要的,但没有其他的
答案 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 . ', ';
}