我正在用 php 编写一些代码,我发现了这个问题:$a = 4.60;$b = 5.05; $c = 2.60;$r = ($a + $b + $c) * 0.1;echo "r: $r\n";echo "r sprintf1: " . sprintf("%.2f",$r) . "\n";echo "r sprintf2: " . sprintf("%.2f",1.225) . "\n";输出是:r: 1.225r sprintf1: 1.22r sprintf2: 1.23如您所见,当结果应该相同时,sprintf 的行为有所不同。这是为什么?
2 回答
![?](http://img1.sycdn.imooc.com/54584cb50001e5b302200220-100-100.jpg)
江户川乱折腾
TA贡献1851条经验 获得超5个赞
因为浮点值不精确,用它们做数学运算只会加剧不精确性。
$a = 4.60;
$b = 5.05;
$c = 2.60;
$r = ($a + $b + $c) * 0.1;
// greatly increase the floating point display precision
ini_set('precision', 30);
var_dump( $a, $b, $c, $r, 1.225 );
输出:
float(4.59999999999999964472863211995)
float(5.04999999999999982236431605997)
float(2.60000000000000008881784197001)
float(1.22499999999999986677323704498)
float(1.22500000000000008881784197001)
这就是为什么你永远不应该使用浮点数来代表金钱。
![?](http://img1.sycdn.imooc.com/5333a1d100010c2602000200-100-100.jpg)
饮歌长啸
TA贡献1951条经验 获得超3个赞
当您计算浮点数 ( $r = ($a + $b + $c) * 0.1;
) 时,它的结果不完全是 1.225,而是类似于1.22499999999999986677323704498
。这就是它发生的原因。
所以永远不要相信浮点数结果的最后一位,也不要直接比较浮点数是否相等。
- 2 回答
- 0 关注
- 105 浏览
添加回答
举报
0/150
提交
取消