PHP真的有很多悲剧*********************************************

用户昵称不能为空 2010-08-18 05:50:49
真的很悲剧,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;//输出 12345678901200

echo "<br />";
$number4 = intval($number3);
echo $number4; // 输出 1942892530

echo '<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 />";

?>
...全文
1409 70 打赏 收藏 转发到动态 举报
写回复
用AI写文章
70 条回复
切换为时间正序
请发表友善的回复…
发表回复
rex100 2010-09-28
  • 打赏
  • 举报
回复
方法1
$a = '1234567890123456789012345678901234567890';
$b = '1234567890123456789012345678901234567890';
bcmul($a, $b);

方法2
strsub()先切字 然后连上
hanluner 2010-09-27
  • 打赏
  • 举报
回复
出现2147483647很明显是溢出,以前我做订单号的时候溢出过。
  • 打赏
  • 举报
回复
[Quote=引用 67 楼 k1060220963 的回复:]

哪有你说的那么多别具。真那么多的话它早就该淘汰了。我从来相信语言没有错误。有错误的是我们自己。
[/Quote]

讨论问题别带如此多的情绪。。。
ewing333 2010-09-17
  • 打赏
  • 举报
回复
大整数一般都用不到,201008180936162200本来就是一串数字的字符串,为什么硬要当作整数处理?

什么语言都有自己的优缺点,没有什么悲剧可言。PHP是弱数据类型,了解这一点就好。大数据或精度运算就用bc函数。

k1060220963 2010-09-17
  • 打赏
  • 举报
回复
哪有你说的那么多别具。真那么多的话它早就该淘汰了。我从来相信语言没有错误。有错误的是我们自己。
ycq507 2010-09-16
  • 打赏
  • 举报
回复
可能是溢出问题吧?
阿里酷巴巴 2010-09-14
  • 打赏
  • 举报
回复
应该是溢出了
zhaoyu0826 2010-09-14
  • 打赏
  • 举报
回复
学习了。
若非零落 2010-09-14
  • 打赏
  • 举报
回复
字符串能解决吧,至今没怎么涉及大数运算,不太清楚,一直用字符串。
tabris17 2010-09-13
  • 打赏
  • 举报
回复
[Quote=引用 60 楼 default7 的回复:]
那貌似可以这样用了
bcuml(1234567890123456789,1);
不过很悲剧,弹出提示:调试错误:PHPDocument1 行 3 - Call to undefined function bcuml()
[/Quote]

是bcmul,谢谢
铁马渡江河 2010-08-27
  • 打赏
  • 举报
回复
占位,学习了
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 amani11 的回复:]

php没有悲剧

php支持任意大数计算加减乘除,请查手册的bc开头的几个函数

PHP code

//如上面说的,不要在页面定义,下面的数字会失真
//$number = 13981387193741938571239457123947123481239;

//这样的数字,而是要用字符串
$numberA = '1398138719374193857123945712394712……
[/Quote]
那貌似可以这样用了
bcuml(1234567890123456789,1);
不过很悲剧,弹出提示:调试错误:PHPDocument1 行 3 - Call to undefined function bcuml()



[Quote=引用 50 楼 conqweal 的回复:]

我看到你很杯具
[/Quote]
allniu 2010-08-26
  • 打赏
  • 举报
回复
intval 此函数有很多限制,有时会把前几个作为位标志,也有长度限制,PHP的int是有长度限制的。。最简单的转为数字的方式
$a = '12432423242234'+0;
此为正解;

建议多到 www.allniu.com 去看看
yk295828759 2010-08-26
  • 打赏
  • 举报
回复
<?
$t = 1234567890123456789; // 这里 不同通过GET得到的,没有双引号的

echo sprintf('%0.0f',$t).'<br/>';

$k = $t.' -- ABCEFGHIJKLMN';

echo (int)$t.'<br/>';

echo $k;//
?>

1234567890123456768
2112454912
1.2345678901235E+18 -- ABCEFGHIJKLMN
by53008749 2010-08-25
  • 打赏
  • 举报
回复
学习了。
crazyboy2005 2010-08-24
  • 打赏
  • 举报
回复
建议楼主对数据类型做深入的剖析
zgycsmb 2010-08-24
  • 打赏
  • 举报
回复
php对类型没那么强要求,
接分
amani11 2010-08-24
  • 打赏
  • 举报
回复
[Quote=引用 46 楼 woshiguozhongbin 的回复:]

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


JAVA的数据类型非常严格,byte n = 129;这样的语句编译都通不过
「已注销」 2010-08-24
  • 打赏
  • 举报
回复
我看到你很杯具
tianyaxiao 2010-08-24
  • 打赏
  • 举报
回复
悲剧在于PHP的弱类型
加载更多回复(48)

21,891

社区成员

发帖
与我相关
我的任务
社区描述
从PHP安装配置,PHP入门,PHP基础到PHP应用
社区管理员
  • 基础编程社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧