Heim  >  Artikel  >  Backend-Entwicklung  >  php 如何输出超大的数字?

php 如何输出超大的数字?

WBOY
WBOYOriginal
2016-06-06 20:16:291835Durchsuche

如有这么一个数字,这样定义我不知道可不可以,但如果是函数返回,肯定会有这大的数字

$num=101000000411132513120104;

直接echo

<code>echo $num;
//或者
echo (string)$sum;</code>

都得到

<code>1.0100000041113E+23</code>

如果执行

<code>$num='A'.$num;</code>

输出

<code>A1.0100000041113E+23</code>

如何才能记它在浏览器中原样输出呢?

(ps:当然实现情况很少有这么大的数字,我只想知道用PHP有没有办法解决这个)

回复内容:

如有这么一个数字,这样定义我不知道可不可以,但如果是函数返回,肯定会有这大的数字

$num=101000000411132513120104;

直接echo

<code>echo $num;
//或者
echo (string)$sum;</code>

都得到

<code>1.0100000041113E+23</code>

如果执行

<code>$num='A'.$num;</code>

输出

<code>A1.0100000041113E+23</code>

如何才能记它在浏览器中原样输出呢?

(ps:当然实现情况很少有这么大的数字,我只想知道用PHP有没有办法解决这个)

如果一个整数在php定义或者计算赋值后超出了当前环境int型的最大值,php的做法是将这个整数转换为float型,因为这样可以以科学计数法进行存储。而这一过程,会带来精度的损失,也就是说,你的$num在赋值后已经不完全是原来的数字了,所以也没法原样进行输出。

如果要原样进行输出,要在赋值之前就把值转换成string型,并以此来存储,这样才能保证原样输出。当然,这样做之后也没法再进行运算了,因为一旦运算,又会回归到浮点数存储。

那直接存储为字符串得了。需要计算的时候再转换。

可以参考这一篇文章,直接进行模拟的计算:

http://www.51-n.com/t-3945-1-1.html

PHP计算大数值运算时会出错,当数字太大时,数值会变成科学计数.那怎么来进行PHP超大数值运算,包括加减乘除,幂运算,平方根,取模运算呢?
要解决科学计数的问题,只要赋值时加一对引号即可.


$n = '22222222222222222222222222220';
echo $n;
?>
如果不加引号,显示2.2222222222222E+28,加引号后显示22222222222222222222222222220

超大数值运算,包括加减乘除,幂运算,平方根,取模运算.

使用PHP的bcmath函数创建一个自定义函数,代码如下,
function calc($m,$n,$x){

<code>    $errors=array(
            '被除数不能为零',
            '负数没有平方根'
    );
    switch($x){
            case 'add':
                    $t=bcadd($m,$n);
                    break;
            case 'sub':
                    $t=bcsub($m,$n);
                    break;
            case 'mul':
                    $t=bcmul($m,$n);
                    break;
            case 'div':
                    if($n!=0){
                            $t=bcdiv($m,$n);
                    }else{
                            return $errors[0];
                    }
                    break;
            case 'pow':
                    $t=bcpow($m,$n);
                    break;
            case 'mod':
                    if($n!=0){
                            $t=bcmod($m,$n);
                    }else{
                            return $errors[0];
                    }
                    break;
            case 'sqrt':
                    if($m>=0){
                            $t=bcsqrt($m);
                    }else{
                            return $errors[1];
                    }
                    break;
    }
    $t=preg_replace("/\..*0+$/",'',$t);
    return $t;</code>

}
/用法举例/
echo calc('11111111111111111111111111111111110','10','add');
?>

使用方法:
calc(参数1参数2,参数3);
参数3指定运算方法:add加,sub减,mul乖,div除,pow幂,mod取模,sqrt求算术平方根
加减乖除:参数1 加上/减去/乘以/除以 参数2
幂:参数1 的 参数2 次方.
模:参数1 除以 参数2 得到的余数.
算术平方根:求 参数1 的算术平方根.参数2不起作用,但不能省略.

PHP大体上说没有解决办法,你这种天文数字,可能在专业科学中是有用的,但PHP不是面向专业科学的,既然谁都知道PHP的数字精度有限制,就只能按照这个限制来考虑问题。对于民用来讲,13位的精度无论如何也够用了。

非要PHP支持只能是自己改写内核。(而且还不知道64位操作系统是不是支持。)

$num=101000000411132513120104;赋值后已经$num已经不等于原来的值了,故无法存储原来的值并进行计算,除非在赋值前转化为字符换

据我了解,没有,毕竟数据是给人看的,用户也不想看到那么多0,所以用数学符号就可以了

直接存成字符串吧,如果要计算再转类型

<code>$num='101000000411132513120104';</code>

可以分两段存储

用字符串。
计算的时候,自己写算法。
十以内的总是精确的。

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn