zoukankan      html  css  js  c++  java
  • PHP浮点数引起的四舍五入问题

    同事在开发中,遇到一个浮点数问题,过来问我,问题如下:

    $a = 0.705;
    $b = 20.795;
    $c = 20.715;
    $d = 20.745;
    
    echo sprintf('%0.2f', $a) . '<br>'; //0.70
    echo sprintf('%0.2f', $b) . '<br>'; //20.80
    echo sprintf('%0.2f', $c) . '<br>'; //20.71
    echo sprintf('%0.2f', $d) . '<br>'; //20.75

    所有变量都取2位小数,从结果得知:$b 和 $d 四舍五入了,$a 和 $c 却没有。

    同样第三位小数都是5,怎么会出现这种情况呢?

    同过查阅文档,调试

    echo sprintf('%0.20f', $a). '<br>'; // 0.70499999999999996003
    echo sprintf('%0.20f', $b). '<br>'; // 20.79500000000000170530
    echo sprintf('%0.20f', $c). '<br>'; // 20.71499999999999985789
    echo sprintf('%0.20f', $d). '<br>'; // 20.74500000000000099476

    显然在这里,实际上作为浮点型数据,其精度已经损失了一部分,达不到完全精确。

    所以永远不要相信浮点数结果精确到了最后一位,也永远不要比较两个浮点数是否相等。

    需要说明的是,这不是PHP的问题,而是计算机内部处理浮点数的问题!在 C、JAVA 等语言中也会遇到同样的问题。

  • 相关阅读:
    php-instanceof运算符
    windows10-seaslog安装笔记
    [类和对象]1 封装 调用成员函数
    [C++] 拓展属性
    [C++] 引用详解
    [C++] Const详解
    ROS 常用
    win10 ubuntu16双系统安装教程
    [0] OpenCV_Notes
    Ubuntu16.04安装openCV的问题集合
  • 原文地址:https://www.cnblogs.com/cqingt/p/5459545.html
Copyright © 2011-2022 走看看