PHP整数取余返回负数的相关解决方法
PHP语言虽然功能强大,但并不代表其没有缺点,在编写代码的过程中未免会遇到一些让人头痛的问题。下面我们将为大家介绍有关PHP整数取余返回负数的解决办法。
我们先来看个例子.
$res = 16244799483;
echo $res%9999999;
// 输出结果为 -5069794, 正确的结果应该是4801107
其实这也算上PHP一个BUG吧.最主要是PHP是个弱类型语言.他内置了机器来判断用户的类型.
但是机器毕竟是机器.也有判断出错的时候.就像上面.所以这时候我们就需要人工干预下.
所以我就想到要用下面的方法来解决PHP整数取余返回负数的问题.
$res = floatval(16244799483);
var_dump($res % 9999999);
我们看到结果还是错误的-5069794.
但是值得注意的是返回是一个int类型的.
详细思考了一下.PHP整数取余返回负数的问题是这样处理的.
PHP取余默认为整数的.
而且当你定义$res = 16244799483;
其实就已经溢出了.所以要加上强制类型转换.变成float类型.
但是这样还不够.因为%这个取模计算还是针对整数的.
所以我们需要一个函数fmod.是针对float类型的.
所以最终PHP整数取余返回负数的解决办法为:
$res = floatval(16244799483);
var_dump(fmod($res,9999999));
这样我们就解决了PHP整数取余返回负数这个问题.:)
相关推荐
-
php的sprintf函数的用法 控制浮点数格式
控制浮点数打印格式 浮点数的打印和格式控制是sprintf 的一大常用功能,浮点数使用格式符"%f"控制,默认保留小数点后6 位数字,比如: 复制代码 代码如下: sprintf("%f", 3.1415926); //结果:"3.141593" 但,有时我们希望自己控制打印的宽度和小数位数,这时就应该使用:"%m.nf"格式,其中m 表示打印数字的整体宽度,n 表示小数点后的位数.比如: 复制代码 代码如下: sprintf
-
PHP数据类型之整数类型、浮点数的介绍
语法:整型值可以使用十进制,十六进制或八进制表示,前面可以加上可选的符号(- 或者 +). 八进制表示数字前必须加上 0(零),十六进制表示数字前必须加上 0x. $int1=100; //十进制$int2=-123; //负数$int3=0123; //八进制数$int4=0x1A;//十六进制数 echo PHP_INT_SIZE; //显示一个整数用几个字节来表示echo "<br/>";echo PHP_INT_MAX;echo "<br/>&
-
简单谈谈php浮点数精确运算
bc是Binary Calculator的缩写.bc*函数的参数都是操作数加上一个可选的 [int scale],比如string bcadd(string $left_operand, string $right_operand[, int $scale]),如果scale没有提供,就用bcscale的缺省值.这里大数直接用一个由0-9组成的string表示,计算结果返回的也是一个 string. bcadd - 将两个高精度数字相加 bccomp - 比较两个高精度数字,返回-1, 0, 1
-
PHP中余数、取余的妙用
<?php $ary=array("name","egineer","sonny","tonny","pingk","apple","phone","clone","pink","colle"); foreach($ary as $key=>$value){ $key=$key+1; if($ke
-
PHP取余函数介绍MOD(x,y)与x%y
取余函数 PHP取余函数 PHP两个取余 MOD(x,y) x%y MOD 例如:9/3,9是被除数,3为除数.mod函数是一个求余函数,其格式为: mod(nExp1,nExp2),即是两个数值表达式作除法运算后的余数.那么:两个同号整数求余与你所知的两个正数求余完全一样(即两个负整数与两个正整数的算法一样). 一.两个异号整数求余 1.函数值符号规律(余数的符号) mod(负,正)=正 mod(正,负)=负 结论:两个整数求余时,其值的符号为除数的符号. 2.取值规律 先将两个整数看作是正数
-
php判断两个浮点数是否相等的方法
本文实例讲述了php判断两个浮点数是否相等的方法.分享给大家供大家参考.具体分析如下: 由于浮点数直接用==判断是否相等是不完全正确的,所以下面给出了一个方法,先设定的一个精度,如果在精度范围内相等则认为相等,否则认为不能 <?php $delta = 0.00001; $a = 1.00000001; $b = 1.00000000; if (abs($a - $b) < $delta) { /* $a and $b are equal */ } ?> 希望本文所述对大家的php程序设
-
PHP中浮点数计算比较及取整不准确的解决方法
浮点数计算结果比较 一则浮点数计算例子如下: 复制代码 代码如下: $a = 0.2+0.7; $b = 0.9; var_dump($a == $b); 打印出的结果是:bool(false).也就是说在这里 0.2+0.7 的计算结果与 0.9 并不相等,这显然是有违我们的常识的. 对此问题,PHP官方手册曾又说明:显然简单的十进制分数如 0.2 不能在不丢失一点点精度的情况下转换为内部二进制的格式.这和一个事实有关,那就是不可能精确的用有限位数表达某些十进制分数.例如,十进制的 1/3 变
-
php中让人头疼的浮点数运算分析
本文实例分析了php中让人头疼的浮点数运算.分享给大家供大家参考,具体如下: 在做电商的时候,计算价格是免不了的,然后发现了php的一个坑,口算应该正确的值,php运算出来会跟你不一样 请看下面的代码: $price=69.1; $count=100; $total=$price*$count-6910; echo $total; 你猜一下变量$total的值是多少,运行一下这个代码输出:-9.09494701773E-13 怎么解决这个问题呢? 使用round函数 代码修改成: $price=
-
PHP浮点数精度问题汇总
一.PHP浮点数精度损失问题 先看下面这段代码: 复制代码 代码如下: $f = 0.57; echo intval($f * 100); //56 结果可能有点出乎你的意外,PHP遵循IEEE 754双精度: 浮点数, 以64位的双精度, 采用1位符号位(E), 11指数位(Q), 52位尾数(M)表示(一共64位). 符号位:最高位表示数据的正负,0表示正数,1表示负数. 指数位:表示数据以2为底的幂,指数采用偏移码表示 尾数:表示数据小数点后的有效数字. 再来看看小数用二进制怎么表示:
-
PHP实现大数(浮点数)取余的方法
本文实例讲述了PHP实现大数(浮点数)取余的方法.分享给大家供大家参考,具体如下: 一般我们进行取余运算第一个想到的就是用百分号%,但当除数是个很大的数值,超出了int范围时,这样取余就不准确了. php大数(浮点数)取余函数: /** * php大数取余 * * @param int or float $bn 除数 * @param int $sn 被除数 * @return int 余数 */ //大数(浮点数)取余方法 function Kmod($bn, $sn) { return in
-
PHP中两个float(浮点数)比较实例分析
本文实例讲述了PHP中两个float(浮点数)比较方法.分享给大家供大家参考.具体如下: 最近在开发一个合同管理系统的时候,涉及到两个浮点数比较,算是把我郁闷惨了. 在N久以前,就不晓得从哪里听来的一个"不要用等号去比较浮点数"的"真理",自己平时也在用,好像没有出现啥问题,可这次问题总算是来了. <?php $sum = "12300.00"; $a = "10000.30"; $b = "2000.30&q
随机推荐
- Python运用于数据分析的简单教程
- Android实现保持屏幕常亮功能
- SQL嵌套查询总结
- js 创建书签小工具之理论
- Java通过卖票理解多线程
- 十天学会php(2)
- Android实现listview动态加载数据分页的两种方法
- C#获取计算机名,IP,MAC信息实现代码
- Easyui 之 Treegrid 笔记
- Oracle 11g Dataguard参数详解
- SQL SERVER 数据库备份的三种策略及语句
- Ctrl+Enter提交内容信息
- Android SQLite数据库的增 删 查找操作
- 写给1000-5000 ip的站长兄弟们
- C#实现强制关闭当前程序进程
- Android调用默认浏览器打开指定Url的方法实例
- 输出1000以内的素数的算法(实例代码)
- .NET Core中使用Redis与Memcached的序列化问题详析
- Vue js 的生命周期(看了就懂)(推荐)
- 解决循环中setTimeout执行顺序的问题