Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Implicit conversion from float-string “%s” to int loses precision

Description

Bitshift operators and bitwise operators work on integers, not on floats. When a string is provided, it may be converted to integer or float: in the second case, the deprecation warning is emitted.

The warning is not emitted when the conversion lands on an integer.

Example

<?php

// Extract from php-src/Zend/tests/float_to_int/warnings_string_float_literals.phpt
$var = '1.5'|3;
$var = '1.5'&3;
$var = '1.5'^3;
$var = '1.5' << 3;
$var = '1.5' >> 3;
$var = 3 << '1.5';
$var = 3 >> '1.5';

//OK : PHP is smart enough to round this to integer
((1 / 35) * 35) | 3;

//Implicit conversion from float 0.9999999999999999 to int loses precision 
//The rounding is not sufficient 
((1 / 35) * 7 * 5 ) | 3;

// valid, conversion gives an integer
$var = '14.00000000'|3;

// still valid, conversion does not handle 0.0000000000000001 precision
$var = '13.0000000000000001'|3;

?>

Literal Examples

  • Implicit conversion from float-string “1.5” to int loses precision
  • Implicit conversion from float-string “0.9999999999999999” to int loses precision

Alternatives

  • Cast the string to integer before using it with bitshift or bitwise operators.
  • Round the string to integer before using it with bitshift or bitwise operators.
  • Simplify the expressions before using it with bitshift or bitwise operators.

Changed Behavior

This error may appear following an evolution in behavior, in previous versions. See implicitConversionToInt