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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • PLSQL12.0.7的下载、安装及使用教程

    PLSQL12.0.7的下载、安装及使用教程PLSQL12.0.7的下载、安装及使用教程PL/SQLDeveloper是一个集成开发环境,专门开发面向Oracle数据库的应用,是一款很好的Oracle管理工具(Oracle11g下载与安装图文教程(win10))。1、PLSQL12.0.7下载plsql官方下载地址:https://www.allroundautomations.com/bodyplsqldevreg.html如图…

    2022年6月7日
    38
  • 横向越权与纵向越权[通俗易懂]

    横向越权与纵向越权[通俗易懂]横向越权:横向越权指的是攻击者尝试访问与他拥有相同权限的用户的资源纵向越权:纵向越权指的是一个低级别攻击者尝试访问高级别用户的资源如何防止横向越权漏洞:可通过建立用户和可操作资源的绑定关系,用户对任何资源进行操作时,通过该绑定关系确保该资源是属于该用户所有的。对请求中的关键参数进行间接映射,避免使用原始关键参数名,比如使用索引1代替id值123等如何防止纵向越权漏洞:建议使用基于角色访问控

    2022年6月16日
    44
  • Fatal error: require(): Failed opening required ‘/www/wwwroot/xxxxxx/public/../thinkphp/start.php

    Fatal error: require(): Failed opening required ‘/www/wwwroot/xxxxxx/public/../thinkphp/start.php项目场景:在CentOS8中安装了宝塔,配置thinkphp5.1版本环境时出了问题,在此之前网站虚拟域名成功配置,能够访问站点创建成功的页面问题描述:在访问tp5默认页面时报错Warning:require():open_basedirrestrictionineffect.File(/home/wwwroot/xxxxxx/thinkphp/start.php)isnotwithintheallowedpath(s):(/home/wwwroot/xxxxxx/pub

    2022年8月22日
    5
  • 内存调试MEMWATCH

    内存调试MEMWATCH
    内存调试-MEMWATCH
     
    MEMWATCH由JohanLindh编写,是一个开放源代码C语言内存错误检测工具,您可以自己下载它(请参阅本文后面部分的参考资料)。只要在代码中添加一个头文件并在gcc语句中定义了MEMWATCH之后,您就可以跟踪程序中的内存泄漏和错误了。MEMWATCH支持ANSIC,它提供结果日志纪录,能检测双重释放(double-free)、错误释放(erroneousfree)、没有释放的内存(unfreedmemo

    2022年7月15日
    14
  • linux arpspoof命令,Arpspoof的具体使用

    linux arpspoof命令,Arpspoof的具体使用比如我们要改百度的页面,哪么我们怎么做呢我们要先PING出百度的IP地址,然后在这个IP附近找同一个网段的服务器挨个入侵,就是通常说的C段,就会和百度在同一个交换机下了,然后使用我们提供的软件进行页面更改。看我的命令:arpspoof/i列出网卡数,记下序号,arpspoof/n生成一个JOB.txt这是规则文本,你可以使用TYPE来查看,并在里面加上HACKERBYsh3llc0d…

    2022年10月7日
    3
  • 十天征服单片机百度云_郭天祥十天征服单片机视频下载地址

    十天征服单片机百度云_郭天祥十天征服单片机视频下载地址高级教材《十天学会单片机和C语言编程》ed2k://|file|[十天学会单片机和C语言编程].Lesson1.rar|449712628|262b8896ad6828cd33ed7189fe94cb2d|h=76MXIF34BFV3VUPLLBN3ASNOVCACHTO3|7b&Y0}8J9w,P0E:|-}’Oed2k://|file|[十天学会单片机和C语言编程]…

    2022年5月2日
    34

发表回复

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

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