论坛首页 编程语言技术论坛

保留四位小数运算(1.0001-1)会是什么结果

浏览 3779 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2013-07-26   最后修改:2013-10-28
PHP

刚做一个简单的减法运算,如题
开始很所以然的认为等于0.0001,结果确不是

<?php
echo 1.0001 - 1; //结果等于:9.9999999999989E-5,我和我的小伙伴们都惊呆了。。。
?>


小数位的减法都是这样吗?当保留两位小数时,结果还是我们正常想像的那样。

<?php
echo 1.01 - 1; //结果等于:0.01
?>


那如果要进行如题的运算,该怎么办呢?php手册中有专门的方法bcsub

<?php
echo bcsub(1.0001 , 1, 4); //结果就等于:0.0001了。注意:后面的4,保留4位小数不能少。要不结果也就不对了
?>


这里再提一点,再大一些的运算如14位以上的运算,这个方法也就不能用了

<?php
echo bcsub(98765432101234 , 12345678901234); //14位运算结果等于:86419753200000
echo bcsub(987654321012345 , 123456789012345); //15位运算结果等于:0
?>


最后,大家算钱的时候一定要注意了。不要到时候就悲剧了。

在这里再补充点:
1 intval的整型最大值为:2147483647
如果
<?php
echo intval('2147483648'); //结果还是2147483647,所以格式化长订单号的时候不要用此参数
?>


2 date限制的结束时间是:2038年1月19号,也就是格式化超过这个日期的时候
echo date('Y-m-d', strtotime('2038-01-20'));//结果是:1970-01-01,超过2038-01-19的日期请用,DateTime格式化
   发表时间:2013-07-30  
如果担心小数,可以把钱的单位改成分,搞定。
0 请登录后投票
   发表时间:2013-08-01  
我怀疑我的存在银行的钱就是这样变少的。。。。
0 请登录后投票
   发表时间:2013-08-02  
xieye 写道
如果担心小数,可以把钱的单位改成分,搞定。

把浮点型或者双精度乘以100,转成分,用整型表示,不小心就出问题,用下面的代码试试,有多少中招的
float x = 1.6f;
for(int index = 1; index < 100; index++){
   System.out.println((int)((x+index)*100.0));
}
0 请登录后投票
   发表时间:2013-08-02  
1.0001 - 1     改成    (1.0001*10000-1*10000)/10000
0 请登录后投票
   发表时间:2013-09-11  
bc数学解决了一直困扰我的小数运算的问题!
0 请登录后投票
   发表时间:2013-09-11  
这个问题确实相当麻烦
0 请登录后投票
论坛首页 编程语言技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics