Telegram Group & Telegram Channel
Почему php -r «echo (int) ((0.1+0.7)*10);» выводит 7, а не 8?

В PHP выражение php -r «echo (int) ((0.1 + 0.7) * 10);» выводит 7 вместо ожидаемого 8 из-за особенностей представления чисел с плавающей точкой в компьютерах. Числа, такие как 0.1 и 0.7, не могут быть точно представлены в двоичной системе, что приводит к небольшим погрешностям при вычислениях. В данном случае, результат выражения (0.1 + 0.7) * 10 может быть немного меньше 8, например, 7.999999999999999, и при приведении к целому типу ((int)) дробная часть отбрасывается, давая результат 7.

Рекомендуемые подходы для получения ожидаемого результата:

Округление перед приведением к целому числу:

Используйте функцию round() для округления значения до ближайшего целого перед приведением к типу int:
echo (int) round((0.1 + 0.7) * 10); // выводит 8


Форматирование с заданной точностью:

Примените функцию sprintf() для форматирования числа с определённой точностью перед приведением:
echo (int) sprintf('%.0f', (0.1 + 0.7) * 10); // выводит 8


Использование математических функций произвольной точности:

Для повышения точности вычислений можно использовать функции из расширения bcmath:
echo bcmul(bcadd('0.1', '0.7', 1), '10', 0); // выводит 8



tg-me.com/php_interview_lib/717
Create:
Last Update:

Почему php -r «echo (int) ((0.1+0.7)*10);» выводит 7, а не 8?

В PHP выражение php -r «echo (int) ((0.1 + 0.7) * 10);» выводит 7 вместо ожидаемого 8 из-за особенностей представления чисел с плавающей точкой в компьютерах. Числа, такие как 0.1 и 0.7, не могут быть точно представлены в двоичной системе, что приводит к небольшим погрешностям при вычислениях. В данном случае, результат выражения (0.1 + 0.7) * 10 может быть немного меньше 8, например, 7.999999999999999, и при приведении к целому типу ((int)) дробная часть отбрасывается, давая результат 7.

Рекомендуемые подходы для получения ожидаемого результата:

Округление перед приведением к целому числу:

Используйте функцию round() для округления значения до ближайшего целого перед приведением к типу int:

echo (int) round((0.1 + 0.7) * 10); // выводит 8


Форматирование с заданной точностью:

Примените функцию sprintf() для форматирования числа с определённой точностью перед приведением:
echo (int) sprintf('%.0f', (0.1 + 0.7) * 10); // выводит 8


Использование математических функций произвольной точности:

Для повышения точности вычислений можно использовать функции из расширения bcmath:
echo bcmul(bcadd('0.1', '0.7', 1), '10', 0); // выводит 8

BY Библиотека собеса по PHP | вопросы с собеседований


Warning: Undefined variable $i in /var/www/tg-me/post.php on line 283

Share with your friend now:
tg-me.com/php_interview_lib/717

View MORE
Open in Telegram


telegram Telegram | DID YOU KNOW?

Date: |

How Does Telegram Make Money?

Telegram is a free app and runs on donations. According to a blog on the telegram: We believe in fast and secure messaging that is also 100% free. Pavel Durov, who shares our vision, supplied Telegram with a generous donation, so we have quite enough money for the time being. If Telegram runs out, we will introduce non-essential paid options to support the infrastructure and finance developer salaries. But making profits will never be an end-goal for Telegram.

Tata Power whose core business is to generate, transmit and distribute electricity has made no money to investors in the last one decade. That is a big blunder considering it is one of the largest power generation companies in the country. One of the reasons is the company's huge debt levels which stood at ₹43,559 crore at the end of March 2021 compared to the company’s market capitalisation of ₹44,447 crore.

telegram from tw


Telegram Библиотека собеса по PHP | вопросы с собеседований
FROM USA