PHP在大数字下表现得很滑稽

php acting funny with large numbers

提问人:Chinmay Chandak 提问时间:5/18/2017 最后编辑:Chinmay Chandak 更新时间:5/18/2017 访问量:77

问:

在我的一次大学竞赛中,问题指出将文件中的输入作为数字,然后简单地将其一半添加到自身中。 这些数字是 18 位长整数。我的大部分 php 输出都与实际答案不同(大部分差异是 2 的幂)。
注意:我还将浮点精度设置为 30 位,以便 php 不会将其打印为 1.3434...E+18,而是所有 18 位数字。
这是我的比赛代码。

<?php
$file = fopen("100.in","r");
$inp = [];
fgets($file);

while(!feof($file))
    $inp[] = (double)fgets($file);

fclose($file);

$i = 0;
while(isset($inp[$i])) {
    $half = $inp[$i]/2;
    $sum = $inp[$i] + $half;
    echo "$sum <br>";
    $i++; 
}
?>

我已经用文件中的值检查了输入数组值,并且在将值存储为浮点数或存储为浮点数时没有错误。

此外,在我用 python 计算答案(并将它们存储在文件中)并尝试将实际答案读取为数字后,php 打印的数字与我之前计算的数字相同,而不是我从文件中读取的数字。

所以有人可以告诉我我的代码有什么问题,或者是 php 的问题。以及我该如何纠正它。

您可以在此处查看调试文件

编辑:如果您看到调试文件,您可以清楚地看到问题与大数字无关,因为代码同时打印302309448458254344和1319763928349129856,大于第一个值的 4 倍。

php 点浮 点精度

评论

2赞 Jeremy Harris 5/18/2017
stackoverflow.com/questions/4427020/......而且 stackoverflow.com/questions/2490888/......
0赞 Todor Simeonov 5/18/2017
关于浮点:php.net/manual/en/language.types.float.php
1赞 Terry 5/18/2017
PHP 中是否有 BigInteger 类的可能重复项?
0赞 Chinmay Chandak 5/18/2017
@JeremyHarris,如果您看到调试文件,您可以清楚地看到问题与大数字无关,因为它打印302309448458254344和1319763928349129856,这是第一个值的 4 倍。
0赞 Chinmay Chandak 5/18/2017
@TodorSimeonov所有数字的长度严格为 18 位,没有小数位,即说它们是大整数

答: 暂无答案