(0.7 / 0.001)%10未返回0

时间:2014-11-13 23:24:32

标签: php bitcoin

我正在为比特币学习门户创建一个基于比特币的广告平台。我提到它的原因是,我相信它有助于理解我的问题,从而我可以得到更好的解决方案。我在做什么只是将用户从HTML表单支付的金额传递给PHP页面并检查它是否是10的倍数。代码片段如下......

$orderAmount = $_POST['orderAmount'];
$adUnitPrice = 0.001;
if((($orderAmount/$adUnitPrice) % 10) == 0)
    $standardPayment = true;
else
    $standardPayment = false;

当我将$ orderAmount传递为0.6或0.8时,我得到$ standardPayment = true的预期回报。但是,当我将$ orderAmount传递为0.7时,我得到$ standardPayment = false的意外返回!有人可以告诉我这是什么问题以及如何解决这个问题?

2 个答案:

答案 0 :(得分:3)

bcmath模块可以帮助您

bcmod(bcdiv("0.7", "0.001"), "10"); // returns 0

代码

$orderAmount = $_POST['orderAmount'];
$adUnitPrice = 0.001;
if(bcmod(bcdiv($orderAmount, $adUnitPrice), 10) == 0) {
    $standardPayment = true;
} else {
    $standardPayment = false;
}

甚至

$standardPayment = (bcmod(bcdiv($orderAmount, $adUnitPrice), 10) == 0);

您可以使用php -m检查命令行,查看是否有模块或使用以下内容编写文件

<?php phpinfo(); ?>

并查看是否已启用模块 bcmath

答案 1 :(得分:2)

在IEEE 754浮点数学中,

因此,当你将0.7除以0.001时,你得到的确不是700,而是非常接近700的东西(可能是699.99999999999988631316),因此模数测试失败了。

您应该将价格四舍五入到最接近的分数(或十分之一或类似价格),然后执行“标准付款”测试。