PHP, расчет денег

Dolly

Новичок
PHP, расчет денег

Здравствуйте!
Как считать деньги на php?
Сумма храниться в float, значения с двумя знаками после запятой.

Нужно складывать умножать переменные типа float и чтобы на выводе выходило значение с двумя знаками после запятой. если 15.4 то должно быть 15.40
 

fixxxer

К.О.
Партнер клуба
деньги нельзя хранить в float ввиду ошибок округления

например умножай на 100 и храни в инте
 

fixxxer

К.О.
Партнер клуба
bcmath гы гы. хотя можно просто все считать через sql, где подходящие типы данных есть, а в php оперировать исключительно строками.
 

korpus

злой бобёр
оказывается, чтобы работать с деньгами в PHP, необходимо применять разные ухищрения... мдя
Можно посоветовать поискать что-нибудь в этих функциях.
http://www.php.net/manual/en/book.math.php
Может надо применять числа в формате float, а при вычислениях их округлять это функцией, чтобы избежать неточностей: http://www.php.net/manual/en/function.round.php
 

LONGMAN

Dark Side of the Moon..
Автор оригинала: fixxxer
деньги нельзя хранить в float ввиду ошибок округления

например умножай на 100 и храни в инте
Покажите ошибку округления float пожалуйста.
 

Dovg

Продвинутый новичок
//оффтоп:
тут недавно коллега не смог снять с карточки 3000, хотя банкомат показывал, что на ней 3000.
После некоторых объяснений со стороны банка оказалось, что у него на счету 2999,99...

ps. При демонстрации пользователю баланса, округляйте в меньшую сторону. :)
 

Boroman

Новичок
В MySQL можно хранить деньги в типе decimal (незнаю как в других БД)
 

Dolly

Новичок
Спасибо.

Что приозойдет если переменную типа float сунуть в decimal?
 

Boroman

Новичок
Ничего особенного, просто в decimal можно сразу указывать количество знаков после запятой. Например price decimal(6,2) и если количество этих знаков превосходит указанное, то число округляется до нужного. Этот тип хорошо подходит как раз для хранения денежных сумм.

Вот ссылка на описание: http://www.mysql.ru/docs/man/Numeric_types.html
 

Boroman

Новичок
Ну и как правильно заметили во втором посте, можно использовать number_format если значение берется не из базы (где уже в правильном формате), а при вычислении то в вашем случае будет:

$num = 15.4;
echo number_format( $num, 2, '.', '' ); // выдаст 15.40
 

iceman

говнокодер
> $a = 0.1 + 0.7;
> $b = 0.8;
> var_dump($a, $b, $a == $b); // float(0.8) float(0.8) bool(false)

хм, а почему так?)
 

fixxxer

К.О.
Партнер клуба
примерно потому же, почему 1/3 можно в десятеричном виде представить только в виде периодической дроби (соответственно при конечном наборе знаков мы имеем только приблизительное значение), только с поправкой на двоичное внутренее представление
 

korpus

злой бобёр
Для чисел типа float после каждой операции с ними вроде сложения и вычитания, а также перед занесением в базу данных надо применять round() заданной точностью.
 
Сверху