真的很悲剧,PHP的特别悲剧,现在我还不清楚怎么弄。知道的人请告诉我一下。
<?
$number1 = '201008180936162200';
echo $number1;//输出 201008180936162200$number2 = 201008180936162200;
echo $number2;//输出 2.0100818093616E+017$number3 = 12345678901234;
echo $number3;//输出 12345678901200$number4 = intval($number3);
echo $number4; // 输出 1942892530//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
//用到的一些地方:
//当前网址 ?id=1234567890123456789
echo $_GET['id']*1; //输出 1.2345678901235E+018
echo intval($_GET['id']); // 输出 2147483647 ,更悲剧!!
echo $_GET['id']; // 输出 1234567890123456789
?>大家可以自己测试一下:url.php<?
$number1 = '201008180936162200';
echo $number1;//输出 201008180936162200
echo "<br />";$number2 = 201008180936162200;
echo $number2;//输出 2.0100818093616E+017
echo "<br />";$number3 = 12345678901234;
echo $number3;//输出 12345678901200echo "<br />";
$number4 = intval($number3);
echo $number4; // 输出 1942892530echo '<hr />';
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
//用到的一些地方:
//当前网址 ?id=1234567890123456789
echo $_GET['id']*1; //输出 1.2345678901235E+018
echo "<br />";
echo intval($_GET['id']); // 输出 2147483647 ,更悲剧!!
echo "<br />";
echo $_GET['id']; // 输出 1234567890123456789
echo "<br />";?>

解决方案 »

  1.   

    $_GET['id']是字符,你intval后再*1试试?
      

  2.   

    我的目的就是希望有种方法 等同于 用了intval 返回的类似 “123456 =  intval(123456)” 的整数值,而不会变值。
      

  3.   

    echo $_GET['id'] 这个就是字符串的你想要做啥?
      

  4.   


    比如
    <?php
    $t = 1234567890123456789; // 这里 不同通过GET得到的,没有双引号的
    $k = $t.' -- ABCEFGHIJKLMN';
    echo $k;// 输出 1.2345678901235E+018 -- ABCEFGHIJKLMN, 这里如何得到 1234567890123456789 -- ABCEFGHIJKLMN  呢?会有这样的情况
    ?>
      

  5.   

    你这第一句就不可能出现,如果不是$_GET获得,也就说传递过来的不是字符串,而是大整数,当然有问题
    你应该一开始就是字符串传递过来。
      

  6.   


    你这个赋值语句赋的是什么值,你知道吗?我用 var_dump($t) 看了一下,是这个:float 1.2345678901235E+18所以呀,后面的结果就顺理成章了。其实,为什么你一定要用没有引号的长整数串来做赋值呢?如果不是必须写在源程序里的常量,你一定有办法以“字符串”的形式得到这个值的呀。————————
    淘宝购物也能打折?看看咘唂网就知道了 ^_^
    喜欢这个签名档吗?你也可以制作自己的签名档
      

  7.   

    首先get 传来的接收时都是字符串第二个,字符串转成数值型,可能会有会有变化。
      

  8.   

    事情往往就是这样,刚看到楼主的帖子时,我也打算“教导”楼主一番。但是一测试,就不是那么回事了integer 的范围(32 位有符号)。
    如果给定的一个数超出了 integer 的范围,将会被解释为 float。同样如果执行的运算结果超出了 integer 范围,也会返回 float。
    所以整型数应该是 -2147483648 到 2147483647 区间$n = 1099511627780; //这是 pow(2, 40) 的结果
    echo $n; // 1099511627780
    echo $n + 1; // 1099511627780
    echo $n + 10; // 1099511627790
    echo $n + 6; // 1099511627790什么结论?自己下!
      

  9.   

    php没有悲剧php支持任意大数计算加减乘除,请查手册的bc开头的几个函数
    //如上面说的,不要在页面定义,下面的数字会失真
    //$number = 13981387193741938571239457123947123481239;//这样的数字,而是要用字符串
    $numberA = '13981387193741938571239457123947123481239';
    $numberB = '9437519347519384571937410238471083571293857102983541';//现在,你需要对两数进行计算,比如相乘的结果echo bcmul($numberA, $numberB);
      

  10.   

    $number1 = '201008180936162200';
    echo $number1;//以字符串输出$number2 = 201008180936162200;
    echo $number2;//以科学记数法输出整数$number3 = 12345678901234;
    echo $number3;//这个不知道$number4 = intval($number3);
    echo $number4; // 仔细看下手册上的intval函数//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    //用到的一些地方:
    //当前网址 ?id=1234567890123456789
    echo $_GET['id']*1; //*1后会自动转换为整数,值较大,输出也以科学记数法输出了
    echo intval($_GET['id']); // 仔细看下手册上的intval函数
    echo $_GET['id']; // 以字符串输出
      

  11.   

    var_dump(pow(2, 31));  // float(2147483648)  
    var_dump(pow(2, 30));    //int(1073741824)
     
    var_dump(pow(2, 31)-1);   //float(2147483647) 
    $large_number =  2147483647;  
    var_dump($large_number);  //int(2147483647) $large_number =  2147483648;
    var_dump($large_number);  //float(2147483648) 事情往往出人意料所以整型数应该是 -2147483648 到 2147483647 区间-----老大能说一下为什么是这个区间吗
    我看了一下,整型为4位8字节,长度应为32
      

  12.   

    什么结论啊?我试验的结果怎么跟你的不一样?下面是我的程序和运行结果,一切正常,没有任何“诡异”。
    $n = 1099511627780; //这是 pow(2, 40) 的结果
    var_dump($n);   // float 1099511627780
    var_dump($n+1); // float 1099511627781
    var_dump($n+10);// float 1099511627790
    var_dump($n+6); // float 1099511627786
    --------
    With sufficient thrust, pigs fly just fine. However, this is not necessarily a good idea. It is hard to be sure where they are going to land, and it could be dangerous sitting under them as they fly overhead.
      

  13.   

    bigint在PHP中只能通过双精度浮点(64位)表示要正常显示可以用echo sprintf('%0.0f',1234567890123456);
      

  14.   

    这篇文章描述得很清楚了http://www.mysqlperformanceblog.com/2008/01/10/php-vs-bigint-vs-float-conversion-caveat/
      

  15.   

    数据库也记不住那么大的id啊,特别大就定义成varchar类型
      

  16.   

          if(getenv("HTTP_CLIENT_IP") && strcasecmp(getenv("HTTP_CLIENT_IP"), "unknown")) {
            $this->_IP = getenv("HTTP_CLIENT_IP"); return; 
          } elseif(getenv("HTTP_X_FORWARDED_FOR") && strcasecmp(getenv("HTTP_X_FORWARDED_FOR"), "unknown")) {
            $this->_IP = getenv("HTTP_X_FORWARDED_FOR"); return;
          } elseif (getenv("REMOTE_ADDR") && strcasecmp(getenv("REMOTE_ADDR"), "unknown")) {
            $this->_IP = getenv("REMOTE_ADDR"); return;
          } elseif (isset($_SERVER['REMOTE_ADDR']) && $_SERVER['REMOTE_ADDR'] && strcasecmp($_SERVER['REMOTE_ADDR'], "unknown")) {
            $this->_IP = $_SERVER['REMOTE_ADDR']; return;
          } else {
            $this->_IP = "0.0.0.0"; return;
          }
      

  17.   

          if(getenv("HTTP_CLIENT_IP") && strcasecmp(getenv("HTTP_CLIENT_IP"), "unknown")) {
            $this->_IP = getenv("HTTP_CLIENT_IP"); return; 
          } elseif(getenv("HTTP_X_FORWARDED_FOR") && strcasecmp(getenv("HTTP_X_FORWARDED_FOR"), "unknown")) {
            $this->_IP = getenv("HTTP_X_FORWARDED_FOR"); return;
          } elseif (getenv("REMOTE_ADDR") && strcasecmp(getenv("REMOTE_ADDR"), "unknown")) {
            $this->_IP = getenv("REMOTE_ADDR"); return;
          } elseif (isset($_SERVER['REMOTE_ADDR']) && $_SERVER['REMOTE_ADDR'] && strcasecmp($_SERVER['REMOTE_ADDR'], "unknown")) {
            $this->_IP = $_SERVER['REMOTE_ADDR']; return;
          } else {
            $this->_IP = "0.0.0.0"; return;
          }
    不好意思,搞错了
      

  18.   

    python这方面比较方便,你把特别大的int类型使用string处理就行了,
    加减乘除均可通过'BC math 高精度数学函数'处理。
      

  19.   

    你用的什么环境?我用的是 PHP 5.2.12 (win32)
    ————————
    基于CSDN论坛提供的插件扩展功能,自己做了个签名档工具,分享给大家,欢迎技术交流 :)
      

  20.   


    假的
    int上面有bigint,bigint上面有decimal
      

  21.   

    如果数据是大于 10位的话,我用的是bigint 来存的。但是#32楼 sshhiierlei 说用varchar 来存,我觉得有点怪,因为我以前都是用 int bigint 这样的来存数值的。
    是和PHP有关,因为 intval(1234567890123456789) != 1234567890123456789。
      

  22.   

    is_numeric()先判断 再intval()
      

  23.   


     看来你还没有遇到过这样的情况。<?
    $s = 1234567890123456789;
    if(is_numeric($s)) echo intval($s); //输出 2112454912
    ?>
      

  24.   

    不知道java是怎么样处理的呢???
    如果integer范围不够了,就转化为float?
      

  25.   

    如果整数大于PHP中整数的最大值,自动转化为浮点数保存
      

  26.   

    JAVA的数据类型非常严格,byte n = 129;这样的语句编译都通不过
      

  27.   

    php对类型没那么强要求,
    接分
      

  28.   

    <?
    $t = 1234567890123456789; // 这里 不同通过GET得到的,没有双引号的echo sprintf('%0.0f',$t).'<br/>';$k = $t.' -- ABCEFGHIJKLMN';echo (int)$t.'<br/>';echo $k;// 
    ?>1234567890123456768
    2112454912
    1.2345678901235E+18 -- ABCEFGHIJKLMN
      

  29.   

    intval 此函数有很多限制,有时会把前几个作为位标志,也有长度限制,PHP的int是有长度限制的。。最简单的转为数字的方式
    $a = '12432423242234'+0;
    此为正解;建议多到 www.allniu.com  去看看
      

  30.   

    那貌似可以这样用了
    bcuml(1234567890123456789,1);
    不过很悲剧,弹出提示:调试错误:PHPDocument1 行 3 - Call to undefined function bcuml()
      

  31.   

    大整数一般都用不到,201008180936162200本来就是一串数字的字符串,为什么硬要当作整数处理?什么语言都有自己的优缺点,没有什么悲剧可言。PHP是弱数据类型,了解这一点就好。大数据或精度运算就用bc函数。
      

  32.   

    方法1
    $a = '1234567890123456789012345678901234567890';
    $b = '1234567890123456789012345678901234567890';
    bcmul($a, $b);方法2
    strsub()先切字 然后连上