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--