@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, но и для многих других языков, которые работает с числами с плавающей точкой "напрямую" (не хочу углубляться в техническое подробности, слишком много текста). В свою очередь некоторые языки по умолчанию могут обрабатывать любые числа (и с плавающей точкой и целые) как строки, изначально, и там такой "проблемы" изначально нет (в виду этого, там есть другие проблемы, но это уже другая история).
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Похожие вопросы