@WiNNeR_tig

Почему результат 28?

Задача:
$amount = 0.29;
$kop    = intval((floatval($amount)-intval($amount))*100);
echo intval($amount)." руб. ".(($kop == 0) ? 00 : $kop)." коп.";


Результат:

0 руб. 28 коп.

Вопрос: почему результат 28 ?

sandbox.onlinephpfunctions.com/code/2b962ad947536b...
  • Вопрос задан
  • 228 просмотров
Решения вопроса 1
daager
@daager
Один из вариантов решения конкретной задачи:
$amount=0.29;
list($rub,$kop)=explode(".",$amount);
echo $rub." руб. ".$kop." коп.";


sandbox.onlinephpfunctions.com/code/76c1d28c538620...
P.S. Как сказали выше, если нужно работать с такими числами на постоянной основе, то изучите их работу. На JSе вообще магия:
> 0.1+0.2
< 0.30000000000000004
Ответ написан
Пригласить эксперта
Ответы на вопрос 3
SerafimArts
@SerafimArts
Senior Notepad Reader
https://ru.wikipedia.org/wiki/IEEE_754-2008

P.S. Деньги никогда не хранятся и "оперируются" float переменными. Это догма.
Ответ написан
Комментировать
miraage
@miraage
Старый прогер
php > var_dump((floatval(0.29) - intval(0.29)) * 100);
float(29)
php > var_dump(intval((floatval(0.29) - intval(0.29)) * 100));
int(28)


1) Вы какую лишнюю магию с числами делаете
2) Работу с валютой принято делать целыми числами, например в центах/копейках

А по теме: floating-point-gui.de
Ответ написан
Wolfnsex
@Wolfnsex Куратор тега PHP
Если не хочешь быть первым - не вставай в очередь!
Тут дан подробный ответ на Ваш вопрос. В т.ч. как заметил коллега в в предыдущем ответе - если Вам нужна точность для чисел с плавающей точкой, для этих целей используются либо специальные механизмы (они в т.ч. описаны по ссылке выше) либо используются целые числа, конечный результат которых делится на 100 (это как пример, при работе с деньгами).

P.S. Подобное поведение актуально не только для PHP, но и для многих других языков, которые работает с числами с плавающей точкой "напрямую" (не хочу углубляться в техническое подробности, слишком много текста). В свою очередь некоторые языки по умолчанию могут обрабатывать любые числа (и с плавающей точкой и целые) как строки, изначально, и там такой "проблемы" изначально нет (в виду этого, там есть другие проблемы, но это уже другая история).
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы