Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/238.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
php计算得出1500000-20%的奇怪结果_Php_Percentage_Subtraction - Fatal编程技术网

php计算得出1500000-20%的奇怪结果

php计算得出1500000-20%的奇怪结果,php,percentage,subtraction,Php,Percentage,Subtraction,也许我是瞎子或傻子,但看看我的功能: function max_min_twenty($value) { if ((int)$value == 0) { return "0"; } else { $percent_val = ((int)$value / 100) * 20; $maxvalue = (int)$value + $percent_val; $minvalue = (int)$value - $percent_val; $returnval

也许我是瞎子或傻子,但看看我的功能:

function max_min_twenty($value) {
if ((int)$value == 0) {
    return "0"; 
} else {
    $percent_val = ((int)$value / 100) * 20;
    $maxvalue = (int)$value + $percent_val;
    $minvalue = (int)$value - $percent_val;
    $returnvalue = round($minvalue)."-".round($maxvalue);
    return $returnvalue;
}
}
看来这真的很容易!它的工作原理和它应该的一样,但是如果我的$value是1500000,它会给我$minvalue返回1,2E+6-如果我选择一个不同的数字,或者如果我将百分比更改为19或21,它会做得很好。那是什么

它在PHP版本5.2.4-2ubuntu5.27上运行

是否将数字显式格式化为整数?round返回一个浮点值,因此我认为默认格式会变得混乱或碰到边缘大小写,并恢复为显示科学符号。我无法在上触发该问题-它可能特定于特定的PHP版本/环境-但症状适合

尝试:


我删除了舍入,因为%d强制将参数视为整数;然而,四舍五入规则可能存在细微差异。。我不知道。

尝试使用数字格式

function max_min_twenty($value) {
if ((int)$value == 0) {
    return "0"; 
} else {
    $percent_val = ((int)$value / 100) * 20;
    $maxvalue = (int)$value + $percent_val;
    $minvalue = (int)$value - $percent_val;
    $returnvalue = number_format(round($minvalue),"0","-","")."-   ".number_format(round($maxvalue),"0","-","");
    echo $returnvalue;
}
}

它将科学符号改为标准形式。

您在旧版本的PHP中看到了一个有缺陷的行为。这是在PHP5.3.0中解决的问题

以以下代码为例:

for ($i = 1000000; $i < 2000000; $i += 100000)
    echo round($i) . "--\n";
但是,在PHP 5.3.0及更高版本上,可以看到正确的行为:

1000000--
1100000--
1200000--
1300000--
1400000--
1500000--
1600000--
1700000--
1800000--
1900000--

这可以通过升级PHP或避免循环来解决,正如@user2246674在中所建议的那样。

sprintf方法肯定解决了这个问题-谢谢!但仍然有一个问题,为什么它只以20%的比率突破了1500000美元。这会达到什么样的极限?也许知道这一点也会对我有所帮助-@maisch我不确定-我试着在这里重述,但不能。可能的情况是,epsilon delta计算刚好足够高,使得默认规则将其视为非整数。尾数指数浮点值(如浮点值)不能准确表示其范围内所有可能的整数。似乎只要是浮点值,该错误就不存在舍入。好发现:现在我明白了!谢谢你的解释。现在我在sprintf函数中使用了round,这对我来说很好。
1000000--
1100000--
1.2E+6--
1300000--
1.4E+6--
1500000--
1600000--
1.7E+6--
1800000--
1.9E+6--
1000000--
1100000--
1200000--
1300000--
1400000--
1500000--
1600000--
1700000--
1800000--
1900000--