这可能是一个错误,但我喜欢认为我是愚蠢的,在这里遗漏了一些东西.我有以下代码:
<?php
header("Content-Type: text/plain");
$a='';
$x=[0.575,0.327,9.28,24.3,0.342,0.51,0.96,13.63];
$y=[5,3,29,54,3];
$z=[10,10,1,1,10,10,1,1];
foreach($x as$k=>$v){
echo "\$k = $k".PHP_EOL;
echo "\$v = $v".PHP_EOL;
echo "\$y[\$k] = ".$y[$k%5].PHP_EOL;
echo ($v/$y[$k%5]*$z[$k])*100 . PHP_EOL;
echo chr(($v/$y[$k%5]*$z[$k])*100).PHP_EOL.'---'.PHP_EOL;
$a .= chr(($v/$y[$k%5]*$z[$k])*100);
};
echo $a;
Run Code Online (Sandbox Code Playgroud)
$ a的值应为:
rm -rf /
Run Code Online (Sandbox Code Playgroud)
但我得到的是:
rm-rf /
Run Code Online (Sandbox Code Playgroud)
注意广场..
现在,如果您运行上面的代码,您将(我将停止问题发生的地方):
$k = 0
$v = 0.575
$y[$k] = 5
115
r
---
$k = 1
$v = 0.327
$y[$k] = 3
109
m
---
$k = 2
$v = 9.28
$y[$k] = 29
32
---
Run Code Online (Sandbox Code Playgroud)
现在我们有$ v/$ y [$ k%5]*$ z [$ k]*100它应转换为:(9.28/29*1)*100(我现在注意到,肠胃外检查没用,但它没有修复任何删除它们的东西).
如果你自己这样做:(9.28/29*1)*100 = 32就像PHP评估它一样.然而,chr(32)并没有提供空间,而是一个不可读的角色.
甚至更有趣的是,将它改为9.29(结果为32.0344 [...])确实给了我一个空间,正如我所期望的那样.
我在PHP 7.0上尝试了Windows和centos,结果相同.
任何人都可以通过这里发生的事情来启发我吗?
好旧的浮点再次罢工!
您注意到,将值更改为9.29导致空间非常明显.事实是,你得到的价值是32 ...有点.让我们尝试一些ord(chr(...))来获得真正的价值:
<?php
header("Content-Type: text/plain");
$a = '';
$x = [0.575,0.327,9.28,24.3,0.342,0.51,0.96,13.63];
$y = [5,3,29,54,3];
$z = [10,10,1,1,10,10,1,1];
foreach($x as $k => $v)
{
echo "\$k = $k".PHP_EOL;
echo "\$v = $v".PHP_EOL;
echo "\$y[\$k] = ".$y[$k%5].PHP_EOL;
$tmp = ($v/$y[$k%5]*$z[$k])*100;
echo $tmp.' (but really '.ord(chr($tmp)).')'.PHP_EOL;
echo chr($tmp).PHP_EOL.'---'.PHP_EOL;
$a .= chr($tmp);
};
echo $a;
Run Code Online (Sandbox Code Playgroud)
输出:
$k = 0
$v = 0.575
$y[$k] = 5
115 (but really 114)
r
---
$k = 1
$v = 0.327
$y[$k] = 3
109 (but really 109)
m
---
$k = 2
$v = 9.28
$y[$k] = 29
32 (but really 31)
---
$k = 3
$v = 24.3
$y[$k] = 54
45 (but really 45)
-
---
$k = 4
$v = 0.342
$y[$k] = 3
114 (but really 114)
r
---
$k = 5
$v = 0.51
$y[$k] = 5
102 (but really 102)
f
---
$k = 6
$v = 0.96
$y[$k] = 3
32 (but really 32)
---
$k = 7
$v = 13.63
$y[$k] = 29
47 (but really 47)
/
---
rm-rf /
Run Code Online (Sandbox Code Playgroud)
基本上,打印的浮点值32仅接近 32 - 显然不够接近chr().另请注意,第一个char r实际上是一个sif值被评估的值115.
解?
不要使用浮点数学进行序列化.不,说真的,它有损!
有关进一步阅读,请参阅浮点数学是否已损坏?.
| 归档时间: |
|
| 查看次数: |
53 次 |
| 最近记录: |