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整数取余返回负数这个问题.:)

(0)

相关推荐

  • 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

随机推荐