Почему отрицательный ноль не сравнивается с положительным нулем при использовании bccomp в PHP?

Я пытаюсь сравнить «+0.00000000000» с «+0.00000000000», используя bccomp. Я ожидаю, что результат будет 0, но на самом деле получаю 1.

$ cat bcmath.php
<?php
var_dump(bccomp("+0.00000000000","-0.00000000000"));
?>

$ php bcmath.php
int(1)
$

2

Решение

Вы сравниваете +0 с +0 или +0 с -0. «1» возвращается, когда левый операнд больше правого. «-1» возвращается, когда правый операнд больше левого. «0» возвращается, когда они равны. Если сравнить положительный результат слева с отрицательным справа, он вернет «1».

var_dump(bccomp("+0.00000000000","-0.00000000000"));
1

Другие решения

С обычной арифметической точки зрения -0, 0 и +0 все одинаковы. В вычислениях некоторые операции могут иметь различное поведение.

Например, если вы попробуете

if (-0 == +0)

Вы получите ИСТИНА

bccomp, похоже, является одним из случаев, когда различают положительный ноль и отрицательный ноль.

Честно говоря, я не знаю, почему именно так он себя ведет, я просто знаю, что так и есть, поэтому, если вы пишете программу, основанную на сравнении с использованием bccomp (и возвращающую 0 при сравнении отрицательного нуля с положительным), вы Возможно, вы захотите запустить проверку «если» заранее.

1