googleapis/google-cloud-php

Recapcha: Wrong score conversion

SVillette opened this issue · 1 comments

Description

Hi guys,
I just installed this package and noticed a strange behaviour when an object of class Google\Cloud\RecaptchaEnterprise\V1\RiskAnalysis is hydrated from the json response when creating an assessment (especially the score property). I discovered this bug when I tested recaptcha behaviour with a score threshold of 0.9 and it failed because the score was 0.8999999761581421.

Environment details

  • OS: MacOS
  • PHP version: 8.2
  • Package name and version: googleapis/google-cloud-php-recaptcha-enterprise v1.8.1

Code example

$var = 0.9;
GPBUtil::checkFloat($var);
var_dump($var);

$var = 0.7;
GPBUtil::checkFloat($var);
var_dump($var);

$var = 0.3;
GPBUtil::checkFloat($var);
var_dump($var);

$var = 0.1;
GPBUtil::checkFloat($var);
var_dump($var);

The output is the following : (from https://3v4l.org/CgGYZ)

8.0 - 8.3
float(0.8999999761581421) 
float(0.699999988079071) 
float(0.30000001192092896) 
float(0.10000000149011612)
5.4 - 8.0
float(0.89999997615814)
float(0.69999998807907)
float(0.30000001192093)
float(0.10000000149012)

Hello! Thank you for reporting this! This seems to be an issue in the protobuf layer itself (GPBUtil is part of the protobuf package, not this library).

I have opened up an issue to track it here: protocolbuffers/protobuf#17467

By the looks of the code, it does seem quite intentional (the variable is passed by reference and then set to the result of unpack("f", pack("f", $var))[1]), but I couldn't you why this is being done.

Closing so that discussion can happen in protobuf