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


相关推荐

  • 我国古代的勾股定理

    略微了解了一下古代中国人民对于勾股定理的证明。发现,智慧出自于劳动。何问起当年灌溉插秧需要对位置和时间的精确掌握,所以勾股定理就在劳动中绽放了。一个公式都不需要,看下面的图就可以证明勾股定理了。

    2021年12月25日
    56
  • Vue(4)Vue指令的学习1

    Vue(4)Vue指令的学习1前言Vue官网一共有提供了14个指令,分别如下v-textv-htmlv-showv-if☆☆☆v-else☆☆☆v-else-if☆☆☆v-for☆☆☆v-on☆☆☆v

    2022年7月29日
    9
  • python字符串转义字符_python 转义

    python字符串转义字符_python 转义上图中因为python不知到如何处理一对单引号之后的内容,不能识别第三个单引号。(默认都是以一对单引号或双引号来表示字符串从结束到开始。)长字符串:用三个引号(单引号或者双引号)来代表字符串开始和结束例如在有些情况下,就需要用转义:(1)>>>path=’c:\nowhere’输出的内容换行,不是想要的结果,我们就需要转义用反斜杠\来转义…

    2025年8月13日
    6
  • ubuntu clion 激活码【在线注册码/序列号/破解码】

    ubuntu clion 激活码【在线注册码/序列号/破解码】,https://javaforall.net/100143.html。详细ieda激活码不妨到全栈程序员必看教程网一起来了解一下吧!

    2022年3月19日
    36
  • visifire  柱状图控件

    visifire  柱状图控件最近使用到一个柱状图控件visifire用起来还是比较高级的不过会有水印商业用途需要购买正版效果还是很好的还有动画效果能够识别最大高度创建之前需要引用http://note.youdao.com/noteshare?id=4a8d01bd0bfef2cdc86c5752aad3156…

    2022年7月21日
    15
  • 如何利用Javascript发送GET/POST请求「建议收藏」

    如何利用Javascript发送GET/POST请求「建议收藏」如何利用Javascript发送GET/POST请求最近在做基于TWS的分析系统,因为采用Flask+Java的技术架构方案,所以需要开发Web,然而我自己没有做过类似的开发,所以很多工作是从头开始学着做的。因此,在实现表单数据提交的时候,当时就想到个问题,如果一个页面里内容足够多的话,仅用form提交的话,后台就需要做非常复杂的判断,以此确认用户提交的是哪类数据,这样工程不仅难看,而且低效。于是咨

    2022年5月17日
    35

发表回复

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

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