带双精度的Php比较整数

带双精度的Php比较整数,php,Php,我对这个脚本有问题 $total = 0; $expected_total = 1111; $i = [85.46,85.46,85.46,85.46,85.46,85.46,85.46,85.46,85.46,85.46,85.46,85.46,85.48]; foreach ($i as $item) { $total += $item; } if($total != $expected_total) { echo json_encode(

我对这个脚本有问题

 $total = 0;
    $expected_total =  1111;
    $i = [85.46,85.46,85.46,85.46,85.46,85.46,85.46,85.46,85.46,85.46,85.46,85.46,85.48];
    foreach ($i as $item) { $total += $item; }
    if($total != $expected_total) {
        echo json_encode([$total,$expected_total]);
    }
问题是,在总数的末尾,$总数应该等于$expected_总数。 我考虑了不同的数字类型,我打印了两个变量的类型,一个是double,另一个是integer,所以我将整数转换为double

但结果仍然是一样的

我能找到的唯一解决办法是比较这两个数字的表示方式,将它们转换成一个字符串

 if((string)$total != (string)$expected_total) {
        echo json_encode([$total,$expected_total]);
    }
但显然这是一种黑客行为

你有过类似的问题吗?你是怎么解决的

PHP版本:5.5.9
非常感谢

这不仅仅是PHP的问题。它是关于在内存中表示浮点数的。浮点数的精度有限。PHP使用。仔细阅读这本书,你就会明白

您可以在代码片段中找到如何执行此操作

$a = 1.23456789;
$b = 1.23456780;
$epsilon = 0.00001; //very small number

if(abs($a-$b) < $epsilon) {
    echo "true";
}
$a=1.23456789;
$b=1.23456780;
$epsilon=0.00001//极少数
if(绝对值($a-$b)<$epsilon){
呼应“真”;
}

这不仅仅是PHP的问题。它是关于在内存中表示浮点数的。浮点数的精度有限。PHP使用。仔细阅读这本书,你就会明白

您可以在代码片段中找到如何执行此操作

$a = 1.23456789;
$b = 1.23456780;
$epsilon = 0.00001; //very small number

if(abs($a-$b) < $epsilon) {
    echo "true";
}
$a=1.23456789;
$b=1.23456780;
$epsilon=0.00001//极少数
if(绝对值($a-$b)<$epsilon){
呼应“真”;
}

这不仅仅是PHP的问题。它是关于在内存中表示浮点数的。浮点数的精度有限。PHP使用。仔细阅读这本书,你就会明白

您可以在代码片段中找到如何执行此操作

$a = 1.23456789;
$b = 1.23456780;
$epsilon = 0.00001; //very small number

if(abs($a-$b) < $epsilon) {
    echo "true";
}
$a=1.23456789;
$b=1.23456780;
$epsilon=0.00001//极少数
if(绝对值($a-$b)<$epsilon){
呼应“真”;
}

这不仅仅是PHP的问题。它是关于在内存中表示浮点数的。浮点数的精度有限。PHP使用。仔细阅读这本书,你就会明白

您可以在代码片段中找到如何执行此操作

$a = 1.23456789;
$b = 1.23456780;
$epsilon = 0.00001; //very small number

if(abs($a-$b) < $epsilon) {
    echo "true";
}
$a=1.23456789;
$b=1.23456780;
$epsilon=0.00001//极少数
if(绝对值($a-$b)<$epsilon){
呼应“真”;
}

如果要将它们检查为整数,可以对两个值进行四舍五入。 应将if语句更改为以下内容:

if(round($total) != round($expected_total)) {
  echo json_encode([$total,$expected_total]);
}

如果您这样做,您将比较舍入的值,它们将是相同的。

如果您想将它们检查为整数,您可以对两个值进行舍入。 应将if语句更改为以下内容:

if(round($total) != round($expected_total)) {
  echo json_encode([$total,$expected_total]);
}

如果您这样做,您将比较舍入的值,它们将是相同的。

如果您想将它们检查为整数,您可以对两个值进行舍入。 应将if语句更改为以下内容:

if(round($total) != round($expected_total)) {
  echo json_encode([$total,$expected_total]);
}

如果您这样做,您将比较舍入的值,它们将是相同的。

如果您想将它们检查为整数,您可以对两个值进行舍入。 应将if语句更改为以下内容:

if(round($total) != round($expected_total)) {
  echo json_encode([$total,$expected_total]);
}

如果您这样做,您将比较四舍五入的值,它们将是相同的。

中有一个大的红色标签,上面写着:

浮点数的精度有限

因此,永远不要将浮点数结果信任到最后一位,也不要直接比较浮点数是否相等。如果需要更高的精度,则可以使用和

在这种特定情况下,您可以使用添加浮点数,并使用比较总数。这两个功能都由扩展提供:

foreach ($i as $item) { 
    $total = bcadd((string) $total, (string) $item, 2);
}
if (bccomp((string) $total, (string) $expected_total, 2) == 0) {
    echo json_encode([$total,$expected_total]);
}

墙上有一个大大的红色标签,上面写着:

浮点数的精度有限

因此,永远不要将浮点数结果信任到最后一位,也不要直接比较浮点数是否相等。如果需要更高的精度,则可以使用和

在这种特定情况下,您可以使用添加浮点数,并使用比较总数。这两个功能都由扩展提供:

foreach ($i as $item) { 
    $total = bcadd((string) $total, (string) $item, 2);
}
if (bccomp((string) $total, (string) $expected_total, 2) == 0) {
    echo json_encode([$total,$expected_total]);
}

墙上有一个大大的红色标签,上面写着:

浮点数的精度有限

因此,永远不要将浮点数结果信任到最后一位,也不要直接比较浮点数是否相等。如果需要更高的精度,则可以使用和

在这种特定情况下,您可以使用添加浮点数,并使用比较总数。这两个功能都由扩展提供:

foreach ($i as $item) { 
    $total = bcadd((string) $total, (string) $item, 2);
}
if (bccomp((string) $total, (string) $expected_total, 2) == 0) {
    echo json_encode([$total,$expected_total]);
}

墙上有一个大大的红色标签,上面写着:

浮点数的精度有限

因此,永远不要将浮点数结果信任到最后一位,也不要直接比较浮点数是否相等。如果需要更高的精度,则可以使用和

在这种特定情况下,您可以使用添加浮点数,并使用比较总数。这两个功能都由扩展提供:

foreach ($i as $item) { 
    $total = bcadd((string) $total, (string) $item, 2);
}
if (bccomp((string) $total, (string) $expected_total, 2) == 0) {
    echo json_encode([$total,$expected_total]);
}

还有一节专门讨论这个主题,展示了应该如何进行比较(不涉及字符串),这不仅仅是PHP的问题。它是关于在内存中表示浮点数的。最简单的方法是将所有的价格(它是价格,对吗?)以美分为单位存储,这样您就只能添加和比较整数了。还有一节专门讨论这个主题,展示了应该如何进行比较(不涉及字符串),这不仅仅是PHP的问题。它是关于在内存中表示浮点数的。最简单的方法是将所有的价格(它是价格,对吗?)以美分为单位存储,这样您就只能添加和比较整数了。还有一节专门讨论这个主题,展示了应该如何进行比较(不涉及字符串),这不仅仅是PHP的问题。它是关于在内存中表示浮点数的。最简单的方法是将所有的价格(它是价格,对吗?)以美分为单位存储,这样您就只能添加和比较整数了。还有一部分专门介绍