Сравнение чисел с плавающей точкой для зависит от контекста. Начиная с ровного изменения порядка операций может привести к различным результатам, важно знать, как "равный" Вы хотите, чтобы числа были.
Сравнение чисел с плавающей точкой Bruce Dawson является хорошим местом для запуска при рассмотрении сравнения с плавающей точкой.
следующие определения от искусство программирования Knuth:
bool approximatelyEqual(float a, float b, float epsilon)
{
return fabs(a - b) <= ( (fabs(a) < fabs(b) ? fabs(b) : fabs(a)) * epsilon);
}
bool essentiallyEqual(float a, float b, float epsilon)
{
return fabs(a - b) <= ( (fabs(a) > fabs(b) ? fabs(b) : fabs(a)) * epsilon);
}
bool definitelyGreaterThan(float a, float b, float epsilon)
{
return (a - b) > ( (fabs(a) < fabs(b) ? fabs(b) : fabs(a)) * epsilon);
}
bool definitelyLessThan(float a, float b, float epsilon)
{
return (b - a) > ( (fabs(a) < fabs(b) ? fabs(b) : fabs(a)) * epsilon);
}
, Конечно, выбирая эпсилон зависит от контекста и определяет, как равный Вы хотите, чтобы числа были.
Другой метод сравнения чисел с плавающей точкой должен посмотреть на ULP (единицы в последнем месте) чисел. Не имея дело конкретно со сравнениями, бумага , Что каждый программист должен знать о числах с плавающей точкой , является хорошим ресурсом для понимания, как плавающая точка работает и каковы ловушки, включая то, каков ULP.
Собственный класс PHP SoapClient
не поддерживает составные сообщения (и сильно ограничен во всех вопросах WS- *), и я также думаю, что ни написанные PHP библиотеки NuSOAP и Zend_Soap не могут справиться с такого рода сообщениями SOAP.
Я могу придумать два решения:
расширить класс SoapClient
и перезаписать SoapClient :: __ doRequest ()
, чтобы получить фактическую строку ответа, которую вы затем можете проанализировать по своему усмотрению.
класс MySoapClient расширяет SoapClient
{
публичная функция __doRequest ($ request, $ location, $ action, $ version, $ one_way = 0)
{
$ response = parent :: __ doRequest ($ request, $ location, $ action, $ version, $ one_way);
// анализируем $ response, извлекаем составные сообщения и т. д.
}
}
Это может быть несколько сложно, но стоит попробовать.
используйте более сложную клиентскую библиотеку SOAP для PHP. Первое и единственное, что приходит мне в голову, это WSO2 WSF / PHP , который включает SOAP MTOM, WS-Addressing, WS-Security, WS-SecurityPolicy, WS-Secure Conversation и WS-ReliableMessaging за счет необходимо установить собственное расширение PHP.
Использование второй идеи С. Герига здесь отлично сработало.
В большинстве случаев у вас есть только одно сообщение, упакованное в сообщение MIME MultiPart. В этих случаях возникает исключение « SoapFault: [Client] похоже, что у нас нет XML-документа ». Здесь подойдет следующий класс:
class MySoapClient extends SoapClient
{
public function __doRequest($request, $location, $action, $version, $one_way = 0)
{
$response = parent::__doRequest($request, $location, $action, $version, $one_way);
// strip away everything but the xml.
$response = preg_replace('#^.*(<\?xml.*>)[^>]*$#s', '$1', $response);
return $response;
}
}