`

php浮点数精度警告

    博客分类:
  • php
阅读更多

先出道题:

<?php
echo intval(( (0.1+0.7) * 10 ));
?>

 会输出多少?8?7!

 

在讲为什么前先再重温一下php的int

整型(integer)的形式描述: 
decimal     : [1-9][0-9]*
            | 0

hexadecimal : 0[xX][0-9a-fA-F]+

octal       : 0[0-7]+

integer     : [+-]?decimal
            | [+-]?hexadecimal
            | [+-]?octal

 自 PHP 4.4.0 和 PHP 5.0.5后,最大值可以用常量PHP_INT_MAX来表示。

 

 

<?php
var_dump(01090); // 八进制 010 = 十进制 8
?> 

 如果向八进制数传递了一个非法数字(即 8 或 9),则后面其余数字会被忽略。

 

再来温故一下float

浮点数的形式表示: 
LNUM          [0-9]+
DNUM          ([0-9]*[\.]{LNUM}) | ({LNUM}[\.][0-9]*)
EXPONENT_DNUM [+-]?(({LNUM} | {DNUM}) [eE][+-]? {LNUM}) 

关于浮点数精度的警告

显然简单的十进制分数如同 0.10.7不能在不丢失一点点精度的情况下转换为内部二进制的格式。这就会造成混乱的结果:例如,floor((0.1+0.7)*10)通常会返回 7 而不是预期中的 8,因为该结果内部的表示其实是类似 7.9

这和一个事实有关,那就是不可能精确的用有限位数表达某些十进制分数。例如,十进制的 1/3 变成了 0.3

所以永远不要相信浮点数结果精确到了最后一位,也永远不要比较两个浮点数是否相等。如果确实需要更高的精度,应该使用任意精度数学函数或者 gmp 函数

分享到:
评论

相关推荐

    简单谈谈php浮点数精确运算

    比如在初始的例子中,`bcadd($a, $b, 2)` 可以确保结果精确到小数点后两位,从而避免了浮点数精度问题导致的错误。 为了保证浮点数计算的精确性,开发人员应尽量避免依赖浮点数的直接比较,而是使用 BCMath 或 GMP...

    PHP下的浮点运算不准的解决方法

    在这个例子中,`bcadd`函数的第三个参数(2)指定了小数点后保留的位数,从而解决了浮点数精度问题,确保结果与预期相符。 在处理浮点数时,还需要注意以下几点: 1. **避免直接比较浮点数的相等性**:由于浮点数的...

    php如何比较两个浮点数是否相等详解

    PHP官方手册警告说,永远不要直接比较两个浮点数是否相等,因为这样的比较几乎总是不准确的。解决这个问题的方法通常涉及到设定一个容差值(epsilon),以判断两个浮点数是否足够接近,可以视为相等。 方法一:设置...

    php7.2开发手册.zip

    2. **浮点数比较**:PHP 7.2引入了更精确的浮点数比较,避免了由于浮点数精度问题导致的错误结果。 3. **类型声明增强**:现在可以为类属性添加类型声明,提高了代码的可读性和健壮性。 4. **废弃警告**:使用已废弃...

    php-7.2.13.tar.gz

    3. **浮点数精度提升**:PHP 7.2改进了浮点数的表示和计算,减少了由于浮点误差导致的问题。 4. **废弃警告**:PHP 7.2开始对一些旧的、不推荐使用的函数和特性发出警告,鼓励开发者使用更现代、更安全的替代方案。...

    php7中文手册

    - **浮点数精度**:PHP7增强了浮点数的处理,减少了因浮点数运算导致的精度问题。 6. **其他改进**: - **空数组和 false 的优化**:在某些操作中,空数组和 `false` 会更快地得到处理。 - **内存限制的调整**:...

    PHP5 中文手册

    - **浮点数精度提升** - PHP5中的浮点数处理精度有所提高,减少了计算误差。 - **NULL 值的特殊性** - NULL 成为了一个独立的数据类型,可以表示变量没有被赋值。 **4. 文件系统操作** - **fileinfo 扩展** - ...

    PHP英文单词汇总.pdf

    30.double 和 real:在 PHP 中,double 是指双精度浮点数,而 real 则是指实数。 31.key 和 value:在 PHP 中,key 是指键,而 value 则是指值。 32.var_dump 和 gettype:在 PHP 中,var_dump 是指显示数据信息,...

    php代码-环境为 PHP7.2 版本

    - **浮点数精度**:在PHP 7.2中,浮点数的显示格式可以自定义,允许开发者更精确地控制浮点数的输出。 - **弃用警告**:PHP 7.2开始废弃一些旧函数,如`mysql_*`系列函数,鼓励开发者转向更安全的`mysqli`或`PDO`...

    php的一些配置

    设置浮点数运算的精度,单位是小数位数。默认为`12`,对于需要高精度计算的应用,可根据需求调整此值。 #### 6. `y2k_compliance` 此配置项用于确保PHP能够正确处理千禧年问题,即日期格式转换时是否考虑2000年及...

    php调试手册

    `printf`函数允许开发者以格式化的形式输出字符串,这对于调试浮点数和整数之间的转换非常有用。例如,在处理金融计算时,可能需要确保数值精度。 ```php $value = 10.0 / 3; echo "Value: " . $value . "\n"; // ...

    PHP 第二节 数据类型之数值型

    - 从浮点数转换为整型时,PHP会进行截断,取整数部分,不进行四舍五入,也没有警告或通知。 三、浮点型(float或double) 浮点型表示带有小数部分的数值。与整型相比,浮点型的精度会受到限制,通常精度为14位十...

    php数组函数序列之array_sum() - 计算数组元素值之和

    而如果数组中包含浮点数,则函数会返回一个浮点数作为结果,这保证了结果的精度。 值得注意的是,在PHP4.2.1之前的版本中,array_sum()函数会对传入的数组产生副作用,它会修改数组本身,将其中的字符串值尝试转换...

    详谈PHP基础与JS操作的区别(必看篇)

    - 双精度浮点数(double) - 小数(decimal) - 布尔型(bool) - 日期时间类型(datetime) - 字符串(string) PHP的数据类型: - 布尔型(bool) - 整型(int) - 浮点型(float 或 double) - 字符型(char) -...

    php coutlt;lt;的一点看法

    在赋值超出`int`范围时,C++编译器通常不会给出错误或警告,因此程序员需要自行检查和确保数值的正确性。 对于`char`型数组(即字符串变量),在C++中,使用`std::cout`输出没有特定的长度限制,但需要注意内存分配...

    2021-2022计算机二级等级考试试题及答案No.452.docx

    4. **二维数组声明**:正确的二维数组声明方式是 `double a[3][4]`,这声明了一个3行4列的双精度浮点数数组。 5. **文件操作**:在文件操作中,open() 函数可以打开已存在的文件,但并不会自动加载文件内容到内存。...

Global site tag (gtag.js) - Google Analytics