BC高精确度函数使用。

BC高精确度函数使用。

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 
bcdiv — 将两个高精度数字相除 
bcmod — 求高精度数字余数 
bcmul — 将两个高精度数字相乘 
bcpow — 求高精度数字乘方 
bcpowmod — 求高精度数字乘方求模,数论里非常常用 
bcscale — 配置默认小数点位数,相当于就是Linux bc中的”scale=” 
bcsqrt — 求高精度数字平方根 
bcsub — 将两个高精度数字相减

首先看一段代码:

?
1
2
3
4
<?php
$a
= 0.1;
$b
= 0.7;
var_dump((
$a
+
$b
) == 0.8);

打印出来的值居然为 boolean false

这是为啥?PHP手册对于浮点数有以下警告信息:

Warning 
浮点数精度
显然简单的十进制分数如同 0.1 或 0.7 不能在不丢失一点点精度的情况下转换为内部二进制的格式。这就会造成混乱的结果:例如,floor((0.1+0.7)*10) 通常会返回 7 而不是预期中的 8,因为该结果内部的表示其实是类似 7.9999999999…。 
这和一个事实有关,那就是不可能精确的用有限位数表达某些十进制分数。例如,十进制的 1/3 变成了 0.3333333. . .。 
所以永远不要相信浮点数结果精确到了最后一位,也永远不要比较两个浮点数是否相等。如果确实需要更高的精度,应该使用任意精度数学函数或者 gmp 函数

那么上面的算式我们应该改写为

?
1
2
3
4
<?php
$a
= 0.1;
$b
= 0.7;
var_dump(
bcadd
(
$a
,
$b
,2) == 0.8);

这样就能解决浮点数的计算问题了

  1. $s = intval(1.2); // int 1  
  2. $s = intval(0.85); // int 0  
  3. $s = intval(-0.85); // int 0  
  4. $s = intval(-300); // int 300  
  5. $s = intval(-1.250); // int -1  
  6. $s = bcmul(1.2, 1); //string 1  
  7. $s = bcmul(0.85, 1); //string 0  
  8. $s = bcmul(-0.85, 1); //string -0  
  9. $s = bcmul(-300, 1); //string -300  
  10. $s = bcmul(-1.250, 1); //string -1  
  11. var_dump($s);  
  12. exit();  BC高精确度函数使用。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/113724.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Visual Studio 2019 Community 离线注册教程「建议收藏」

    Visual Studio 2019 Community 离线注册教程「建议收藏」VS2019社区版是免费的,但是需要登录微软账户,不登录只能使用30天,30天之后就无法使用了,如下图:首先使用能够访问外网的电脑登录微软账户注册VS。也可以使用我这个Licensing,直接进入第三步 找到注册文件,路径:C:\Users\{系统登录用户}\AppData\Local\Microsoft\VSCommon 将两个文件夹复制到需要注册的电脑上,路径:C:\…

    2022年10月13日
    2
  • SpringBoot+Mybatis实现分页查询[通俗易懂]

    SpringBoot+Mybatis实现分页查询[通俗易懂]文章目录前言1.引入依赖2.Mapper中接口3.修改XML文件4.controller层调用接口5.测试总结前言分页查询是在web开发中常用的一种技术,当某个页面查询返回的数据量较大时,为了提高性能和用户体验不能将所有数据一次性返回给过前端,这时候就需要用到分页查询了PageHelper是一款开源的Mybatis第三方物理分页插件,springboot项目中集成PageHelper插件非…

    2022年5月5日
    45
  • 视差Disparity与深度图

    视差Disparity与深度图转自:http://www.elecfans.com/d/863829.html双目立体视觉,在百度百科里的解释是这样解释的:双目立体视觉(BinocularStereoVision)是机器视觉的一种重要形式,它是基于视差原理并利用成像设备从不同的位置获取被测物体的两幅图像,通过计算图像对应点间的位置偏差,来获取物体三维几何信息的方法。一、视差Disparity与深度图提到双目视觉就不得不提视差图:双目立体视觉融合两只眼睛获得的图像并观察它们之间的差别,使我们可以获得明显的深度感,建立特征间的对

    2022年4月25日
    49
  • redis缓存工具Jedis进行跨jvm加锁(分布式应用)–不幸暂弃用–能够做第三方锁使用…

    redis缓存工具Jedis进行跨jvm加锁(分布式应用)–不幸暂弃用–能够做第三方锁使用…

    2021年9月12日
    59
  • TCP和UDP的最完整的区别[通俗易懂]

    TCP和UDP的最完整的区别[通俗易懂]TCP和UDP两种协议的比较汇总

    2022年6月7日
    40
  • 计算机快捷键任务管理器,打开电脑任务管理器快捷键是什么

    计算机快捷键任务管理器,打开电脑任务管理器快捷键是什么电脑使用很广泛,很多时候在使用电脑的过程中都会用到任务管理器,学习啦小编整理的本文为大家讲解打开电脑任务管理器快捷键是什么,一起来了解吧。打开电脑任务管理器快捷键是什么设备管理器是Windows操作系统提供的对计算机硬件进行管理的一个图形化工具。一般我们可通过设备管理器查看计算机硬件的配置信息,获取相关硬件的驱动程序信息以及进行更新、禁用、停用或启用相关设备等。打开电脑任务管理器快捷键:Ctrl+…

    2022年6月18日
    28

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号