PHP . SU
Программирование на PHP, MySQL и другие веб-технологии
Без описания
Поиск в теме | Версия для печати
nepster
Отправлено: 09 Августа, 2013 - 13:51:43
Частый гость
Покинул форум
Сообщений всего: 195
Дата рег-ции: Июль 2012
Помог: 0 раз(а)
Выбрал для денежных операций тип данных
decimal .
Начал проверять, все работает, за исключением 1 момента:
пишем в базу, и туда попадает 497.0000 , вот это полное кидалово.
Тип данных в mysql decimal(19,4) DEFAULT NULL
Подскажите пожалуйста как сделать так, что бы в базу записывалось значение без округлений
eai
Отправлено: 09 Августа, 2013 - 13:54:33
Частый посетитель
Покинул форум
Сообщений всего: 521
Дата рег-ции: Сент. 2009
Откуда: Петроград
Помог: 10 раз(а)
Округли записываемое значение до точности колонки.
round($data, 4, PHP_ROUND_HALF_DOWN)
ну или точность колонке на мускле увеличь до 5ти знаков
(Отредактировано автором: 09 Августа, 2013 - 13:56:56)
Мелкий
Отправлено: 09 Августа, 2013 - 13:55:30
Активный участник
Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009
Откуда: Россия, Санкт-Петербург
Помог: 618 раз(а)
nepster пишет: decimal(19,4 )
хм. А чему вы удивляетесь?
(Добавление)
VestCoastman , деньги в форматах с плавающей запятой хранить нельзя.
nepster
Отправлено: 09 Августа, 2013 - 14:05:18
Частый гость
Покинул форум
Сообщений всего: 195
Дата рег-ции: Июль 2012
Помог: 0 раз(а)
подскажите пожалуйста как нужно хранить денежные значения, таким образом, что бы не терялись копейки ?
Цитата:
Округли записываемое значение до точности колонки.
round($data, 4, PHP_ROUND_HALF_DOWN)
ну или точность колонке на мускле увеличь до 5ти знаков
Возвращает 497.
5 знаком или 7, в любом случае иногда будут такие моменты когда будет непонятное-кол знаком после точки. При вычислении % или каких-либо операций
eai
Отправлено: 09 Августа, 2013 - 14:23:32
Частый посетитель
Покинул форум
Сообщений всего: 521
Дата рег-ции: Сент. 2009
Откуда: Петроград
Помог: 10 раз(а)
Да чета раунд глючит ... мож проблема и в прокладке ...
Как решение
$money = ((int)($money*10000))/10000;
Да и осторожно при формировании выражения SQL, не знаю каким методом вы его формируете.
(Отредактировано автором: 09 Августа, 2013 - 14:25:25)
DlTA
Отправлено: 09 Августа, 2013 - 14:38:40
Постоянный участник
Покинул форум
Сообщений всего: 2952
Дата рег-ции: Окт. 2010
Помог: 53 раз(а)
eai пишет: Как решение
$money = ((int)($money*10000))/10000;
нет, это не решение
а деньги хранят в целочисленному количестве копеек (ну или что у вас там минимальная единица расчета)
Мелкий
Отправлено: 09 Августа, 2013 - 14:49:54
Активный участник
Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009
Откуда: Россия, Санкт-Петербург
Помог: 618 раз(а)
nepster пишет: будут такие моменты когда будет непонятное-кол знаком после точки. При вычислении % или каких-либо операций
То вам и нужно округлять куда-нибудь до необходимой точности.
nepster пишет: Возвращает 497.
Разумеется. А что не так? 496.99999 с округлением до 4 знаков после запятой и должно быть 497.
eai
Отправлено: 09 Августа, 2013 - 14:51:41
Частый посетитель
Покинул форум
Сообщений всего: 521
Дата рег-ции: Сент. 2009
Откуда: Петроград
Помог: 10 раз(а)
DlTA пишет: eai пишет: Как решение
$money = ((int)($money*10000))/10000;
нет, это не решение
а деньги хранят в целочисленному количестве копеек (ну или что у вас там минимальная единица расчета)
Почему не решение, Реально интересно.
А насчет вашего решения , то я бы так и сделал, но вопрос насколько много уже кода и как много надо переделывать.
По уму надо бы специальный тип данных, аля "С фиксированной запятой"
nepster
Отправлено: 09 Августа, 2013 - 14:58:36
Частый гость
Покинул форум
Сообщений всего: 195
Дата рег-ции: Июль 2012
Помог: 0 раз(а)
Собственно как вам такое решение:
PHP:
скопировать код в буфер обмена
$money1 = 213.99999 ;
$money2 = 283 ;
$money = $money1 + $money2 ; // результат 496.99999
$money = $this -> my_number_format ( $money ) ;
{
echo $money ; // 496.9999
Yii
:: app ( ) -> db -> createCommand ( ) -> update ( 't3' , array ( 'd' => $money ,
) ) ;
}
Все проходит как нужно, теперь функция:
идем на php.net
http://www.php.net/manual/ru/fun...format.php#91047
и немного подстраиваем данную функцию
PHP:
скопировать код в буфер обмена
function my_number_format( $number , $dec_point = '.' )
{
$was_neg = $number < 0 ; // Because +0 == -0
{
$rest = $dec_point . substr ( $tmp [ 1
] , 0
, 4
) ; $out .= $rest ;
}
if ( $was_neg ) $out = "-$out " ;
return $out ;
}
работает как нужно! Вопрос только на сколько корректно будет работать с данным методом
nepster
Отправлено: 09 Августа, 2013 - 15:05:23
Частый гость
Покинул форум
Сообщений всего: 195
Дата рег-ции: Июль 2012
Помог: 0 раз(а)
Смахивает, и при этом я где-то слышал, что в СССР делали все качественно на совесть =)
(Добавление)
По сути такой момент с 9999 в остатке будет встречаться достаточно редко.
А значит эта функция именно для 2 случаев, если в друг при вычислениях будет момент, когда остаток привысит 4 числа и когда в остатке будет 9999.
Собственно это редкие случаи
(Отредактировано автором: 09 Августа, 2013 - 15:08:52)
Мелкий
Отправлено: 09 Августа, 2013 - 15:08:39
Активный участник
Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009
Откуда: Россия, Санкт-Петербург
Помог: 618 раз(а)
nepster пишет: на сколько корректно будет работать
Некорректно.
4.00006 должно округляться до 4.0001
1.99997 - до 2
Правила округления давно видели?
Если вам по бизнес-логике нужно округлять в меньшую сторону -
floor
Поиск в теме | Версия для печати
Страниц (3): [1] 2 3 »
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Вопросы новичков »
Все гости форума могут просматривать этот раздел. Только зарегистрированные пользователи могут создавать новые темы в этом разделе. Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
Powered by ExBB FM 1.0 RC1. InvisionExBB