奇怪的浮点数递增结果,有PHP Laravel API
Strange floating number increment result, with PHP Laravel API
我只是使用 PHP Laravel 作为 API 来简单地增加浮点数,如下面的代码;
代码:
public function testArrIncrement(){
$arr["test"]["words"] = "The quick brown fox jumps over a lazy dog";
$arr["test"]["number"] = 0;
for($i=0; $i<11; $i++) $arr["test"]["number"] += 0.01;
return response()->json($arr, 200);
}
结果:
{
"test": {
"words": "The quick brown fox jumps over a lazy dog",
"number": 0.10999999999999999
}
}
奇怪的是,为什么$arr["test"]["number"]的值不是0.11,而是0.10999999999999999?
但是如果我只使用没有任何框架的普通单个文件 PHP 尝试相同的代码,一切正常 $arr["test"]["number"] 的值确实是 0.11 .
代码:
$arr["test"]["words"] = "The quick brown fox jumps over a lazy dog";
$arr["test"]["number"] = 0;
for($i=0; $i<11; $i++) $arr["test"]["number"] += 0.01;
var_dump($arr);
结果:
array(1) { ["test"]=> array(2) { ["words"]=> string(41) "The quick brown fox jumps over a lazy dog" ["number"]=> float(0.11) } }
请帮忙解释为什么会这样?
这是因为数据被编码成json。如果您尝试 json_encode
,您将遇到预期的相同行为。您必须在 php.ini
或您的代码中设置精度,如下所示:
public function testArrIncrement(){
ini_set('serialize_precision', 14);
$arr["test"]["words"] = "The quick brown fox jumps over a lazy dog";
$arr["test"]["number"] = 0;
for($i=0; $i<11; $i++) $arr["test"]["number"] += 0.01;
return response()->json($arr, 200);
}
我只是使用 PHP Laravel 作为 API 来简单地增加浮点数,如下面的代码;
代码:
public function testArrIncrement(){
$arr["test"]["words"] = "The quick brown fox jumps over a lazy dog";
$arr["test"]["number"] = 0;
for($i=0; $i<11; $i++) $arr["test"]["number"] += 0.01;
return response()->json($arr, 200);
}
结果:
{
"test": {
"words": "The quick brown fox jumps over a lazy dog",
"number": 0.10999999999999999
}
}
奇怪的是,为什么$arr["test"]["number"]的值不是0.11,而是0.10999999999999999?
但是如果我只使用没有任何框架的普通单个文件 PHP 尝试相同的代码,一切正常 $arr["test"]["number"] 的值确实是 0.11 .
代码:
$arr["test"]["words"] = "The quick brown fox jumps over a lazy dog";
$arr["test"]["number"] = 0;
for($i=0; $i<11; $i++) $arr["test"]["number"] += 0.01;
var_dump($arr);
结果:
array(1) { ["test"]=> array(2) { ["words"]=> string(41) "The quick brown fox jumps over a lazy dog" ["number"]=> float(0.11) } }
请帮忙解释为什么会这样?
这是因为数据被编码成json。如果您尝试 json_encode
,您将遇到预期的相同行为。您必须在 php.ini
或您的代码中设置精度,如下所示:
public function testArrIncrement(){
ini_set('serialize_precision', 14);
$arr["test"]["words"] = "The quick brown fox jumps over a lazy dog";
$arr["test"]["number"] = 0;
for($i=0; $i<11; $i++) $arr["test"]["number"] += 0.01;
return response()->json($arr, 200);
}