解析PHP中intval()等int转换时的意外异常情况

<?php
$a = 9.45*100;
var_dump($a);
var_dump(intval($a));
$a = 945*1.00;
var_dump($a);
var_dump(intval($a));
?>

运行结果:float(945) int(944) float(945) int(945)

这个代码虽然把结果都告诉了,但是很多人还是看不懂,这样就解释不了为什么会有意想不到的转型情况发生。
网上对这个情况讲的都模棱两可不知所云的。我在这里简单的解释下:
9.45这个数字在我们看到的是这样的,但是机器内部却不是这个,而是9.44999999999999999...。所以:
9.449999*100 = 944.9999。这样就可以看懂了吧?intval把尾数直接去掉了,这个叫神马来的呵呵忘了名字了.这样说来,intval和floor()函数差不多咯。呵呵。这个也是我之前没有察觉到的。也没注意到intval会向下舍入。
而 1.00就没有什么1.0099999这样的了,所以945*1.00就会出现一个float的945.那intval去转型自然就不会出现944的情况了。
还有些经典考试题,如:intval((0.1+0.7)*10) 等于7而不是8的。都是这个道理。

 

时间: 2024-10-13 22:33:17

解析PHP中intval()等int转换时的意外异常情况的相关文章

C++ 中 char 与 int 转换问题

itoa 功  能:把一整数转换为字符串 函  数:char *itoa(int value, char *string, int radix); 解  释:itoa 是英文integer to array(将 int 整型数转化为一个字符串,并将值保存在数组 string 中)的缩写. 参  数:value: 待转化的整数.          radix: 是基数的意思,即先将value转化为radix进制的数,范围介于2-36,比如10表示10进制,16表示16进制.          *s

C#中如何把int转换成两个字符的string

部门新开了项目,所以一整周的时间都在瞎忙,为什么称瞎忙?所负责的内容,并没有做好,也是一万个心塞啊.... 说一下最近碰到的一些问题. 用到了计时,但是比如定时是一分半钟,可是显示的时候,想让显示为1:30或者01:30,怎么做呢?说一个自己用的,其他的以后补充. 举个栗子: int timer=(int)(100%60);//second string str=timer.ToString().PadLeft(2,'0'); //将int型转换为String类型的,会转换成2位字符串,若位数不

( 转)Sqlserver中tinyint, smallint, int, bigint的区别 及 10进制转换16进制的方法

一.类型比较 bigint:从-2^63(-9223372036854775808)到2^63-1(9223372036854775807)的整型数据,存储大小为 8 个字节.一个字节就是8位,那么bigint就有64位 int:从-2^31(-2,147,483,648)到2^31-1(2,147,483,647)的整型数据,存储大小为 4 个字节.int类型,最大可以存储32位的数据 smallint:从-2^15(-32,768)到2^15-1(32,767)的整数数据,存储大小为 2 个

既然float不能表示所有的int_那为什么在类型转换时C++将int转换成float?

摘要: 既然float不能表示所有的int,那为什么在类型转换时C++将int转换成float? 问题: 代码如下: int i = 23; float f = 3.14; if (i == f) // 执行某段代码 编译器会将i转换成float类型,然后比较这两个float的大小,但是float能够表示所有的int吗?为什么没有将int和float转换成double类型进行比较呢? 回答: 在整型数的演变中,当int变成unsigned时,会丢掉负数部分(有趣的是,这样的话,0u < -1就是

关于SQL Server 2017中使用json传参时解析遇到的多层解析问题

原文:关于SQL Server 2017中使用json传参时解析遇到的多层解析问题 开发新的系统,DB部分使用了SQL Server从2016版开始自带的Json解析方式. 用了快半年,在个人项目,以及公司部分项目上使用了,暂时还没遇到大的问题,和性能问题. 今天在解析Json的多级参数遇到了点小问题,在此记录一下: 传参内容如下: 1 declare @json varchar(max)=N'{"Customer":36,"Positions":[{"I

日期转换时Safari中返回Invalid Date

问题: 进行日期转换时,Safari中会返回Invalid Date, 而IE 9, Firefox, Chrome and Opera显示正常,代码如下所示: var d = new Date("2011-02-07");  alert(d); 或者var d = new Date("2011-02-07T11:05:00");  alert(d); 解决方案: 不是所有的浏览器都支持new Date 中'yyyy-mm-dd'格式的转换,可以尝试下面的代码: v

C++ 中类型转换 xmlChar * 与Char * 转换,Char *与int 转换,Char *与Float转换,int 与portNumBits转换

使用libxml2 得到一个节点的内容: xmlChar *value = xmlNodeGetContent(node) 1.XmlChar 转换成Char char * stream = (char *) value; 2.Char *与  int 转换 int x = atoi(stream); #include "stdio.h" #include "stdlib.h" main() { char *p="1234567"; int x;

scala中计算的的一个小问题,超出Int.maxValue时不会报错

如果小于Int.max时他不会报错 def sumcount(str:String): Int ={ val ints = for(c <- str)yield { println(c.asInstanceOf[Int]) ; c.asInstanceOf[Int]} println(ints.reduce(_*_)) println(Int.MaxValue) ints.sum } sumcount("Hello") 721011081081118251528962147483

Postgresql中使用to_char进行yyyy-MM-dd HH:mm:ss转换时要注意的问题

在java和一些常用的数据中(mysql/sqlsever)中进行年月日分秒转换的时候,都是用 SELECT to_char(CURRENT_DATE,'yyyy-MM-dd hh:MM:ss') 但是在Postgresql中这样用就会出现问题,在pg中执行上面的语句返回的结果为 2015-05-06 12:05:00 看到了,这并不是我们想要的,那怎么处理呢?在pg中要用下面的方法 SELECT to_char(CURRENT_DATE,'yyyy-MM-dd hh24:MI:ss') 结果如