当前位置: 首页 > 面试题库 >

PHP整数和浮点数比较不匹配

阎劲
2023-03-14
问题内容

我有以下代码

$amount1 = 7299;
$amount2 = 72.9875;

$amount2_in_cents = round($amount2, 2) * 100;

if ($amount1 != $amount2_in_cents) {
    echo "Amount $amount1 != $amount2_in_cents\n";

    var_dump($amount1);
    var_dump($amount2_in_cents);

} else {
    echo "Amounts matched";
}

这是输出

Amount 7299 != 7299
int(7299)
float(7299)

现在我意识到float和int是不同的,但是考虑到四舍五入,我本来希望两个值匹配。我已经通过强制转换为int解决了它。

所以我的问题是,为什么这个比较不能像我期望的那样工作(两个值都匹配)?


问题答案:

请注意PHP手册中的 红色大警告

比较浮点数时不要指望任何东西。即使精度为0,舍入结果仍然是浮点数。在您的特定情况下,碰巧结果要比预期的大一点,因此强制转换为int会导致相等,但对于其他数字,它也可能会比预期的小一点,并且强制转换为int不会四舍五入它,但是要截断它,因此您不能使用强制转换作为解决方法。(请注意,比您的解决方案更好的解决方案是强制转换为string
:),但仍然是一个糟糕的选择。)

如果您需要花钱工作,请始终使用BC Math扩展。

要使用BC Math进行四舍五入,可以使用以下技术:

$x = '211.9452';
$x = bcadd($x, '0.005', 2);


 类似资料:
  • 问题内容: 我想比较PHP中的两个浮点数,如以下示例代码所示: 在此代码中,即使和相同,它也返回条件的结果而不是条件。有没有什么特殊的方法来处理/比较PHP中的浮点数? 如果是,那么请帮助我解决此问题。 还是我的服务器配置有问题? 问题答案: 如果您这样做,它们 应该 是相同的。但是请注意,浮点值的一个特征是 看起来 可以导致相同值的计算实际上不必相同。因此,如果是一个文字并通过计算到达该文字,则

  • 问题内容: 比较浮点数和这样的整数是否安全? 根据JLS(5.6.2。二进制数值提升),如果其中一个参数为,则另一个参数将转换为比较之前的值。但是据我了解,如果转换后的float与原始float二进制相同,则这样的比较将返回true。我们如何确保呢? 问题答案: 是的,您的具体示例很好,因为和都可以精确地表示为。 请注意,通常情况下并非如此:有很多大值无法完全表示为。例如,即使2_000_000_

  • 本文向大家介绍在C / C ++中为浮点数和比较赋一个整数,包括了在C / C ++中为浮点数和比较赋一个整数的使用技巧和注意事项,需要的朋友参考一下 整数是一种数据类型,用于定义一个包含所有正,负或零个非小数值的数字。这些不能有小数。 浮点数是一种数据类型,用于定义具有小数值的数字。这些也可以有小数。 现在,当我们为两者输入相同的值时,我们将检查编译器返回的float和integer值是什么。

  • 问题内容: 我正在寻找比较应该相同的两个数据框。但是,由于浮点精度,我被告知值不匹配。我在下面创建了一个示例进行模拟。如何获得正确的结果,以便最终比较数据帧对两个单元格都返回true? 问题答案: 好的,您可以为此使用: 需要相对公差和绝对公差。这些有默认值:,分别

  • 对于这些代码行,我得到0作为输出,即它们都是相等的。现在,如果我理解正确,a b和c可能会存储稍微不同版本的真值.3因此,当做一个Float.compare(...)对这些值,我希望得到一个输出值,而不是0。为什么我把它们取为0?

  • 本文向大家介绍PHP中浮点数计算比较及取整不准确的解决方法,包括了PHP中浮点数计算比较及取整不准确的解决方法的使用技巧和注意事项,需要的朋友参考一下 浮点数计算结果比较 一则浮点数计算例子如下: 打印出的结果是:bool(false)。也就是说在这里 0.2+0.7 的计算结果与 0.9 并不相等,这显然是有违我们的常识的。 对此问题,PHP官方手册曾又说明:显然简单的十进制分数如 0.2 不能