Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Mysql. Не работает ROUND()

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (3): [1] 2 3 »   

> Без описания
dubasua
Отправлено: 22 Июня, 2015 - 15:36:16
Post Id



Посетитель


Покинул форум
Сообщений всего: 454
Дата рег-ции: Апр. 2012  


Помог: 7 раз(а)




Написал функцию в mysql(calculate_price), где считается цена и возвращается, перед самым возвращением, итоговую цену округляю ROUNDом.
CODE (SQL):
скопировать код в буфер обмена
  1. RETURN ROUND(OUT_PRICE,2);

Но функция возвращает не округленный FLOAT, а что то типо 78.47412354.
Но если вызывать вот так
CODE (SQL):
скопировать код в буфер обмена
  1. SELECT ROUND( calculate_price(some_id_price), 2 );

Тогда все работает. А мне нужно чтобы функция самостоятельно возвращала уже округленное число.

А вот если использовать ROUND без второго аргумента, тогда возвращает INTEGER.
 
 Top
DeepVarvar Супермодератор
Отправлено: 22 Июня, 2015 - 16:04:31
Post Id



Активный участник


Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008  
Откуда: Альфа Центавра


Помог: 353 раз(а)




Для денех используй децимал, а не флоат.
 
 Top
dubasua
Отправлено: 22 Июня, 2015 - 17:22:32
Post Id



Посетитель


Покинул форум
Сообщений всего: 454
Дата рег-ции: Апр. 2012  


Помог: 7 раз(а)




DeepVarvar пишет:
Для денех используй децимал, а не флоат.

Спасибо за подсказку, я в функции изменил тип RETURNS, на DECIMAL(8,2), все стало на свои места...
 
 Top
LIME
Отправлено: 22 Июня, 2015 - 18:50:43
Post Id


Активный участник


Покинул форум
Сообщений всего: 10732
Дата рег-ции: Нояб. 2010  


Помог: 322 раз(а)




DeepVarvar пишет:
Для денех используй децимал, а не флоат.
Илюха ты не прав
Децимал это безразмерное для повышенной точности
Для больших чисел, которые не помещаются в нормальный формат
Погугли этот вопрос
В данной задаче лучше форматировать при выводе и все
(Добавление)
Цитата:

For example, a DECIMAL(18,9) column has nine digits on either side of the decimal point, so the integer part and the fractional part each require 4 bytes. A DECIMAL(20,6) column has fourteen integer digits and six fractional digits. The integer digits require four bytes for nine of the digits and 3 bytes for the remaining five digits. The six fractional digits require 3 bytes.


Цитата:

Например, ДЕСЯТИЧНАЯ колонка (18,9) имеет девять цифр по обе стороны от десятичной точки, так и целая часть дробная часть каждого требуется 4 байта. Колонка ДЕСЯТИЧНАЯ (20,6) имеет четырнадцать целых шесть цифр и знаков после запятой. Целые цифры требуется четыре байта для девяти цифр и 3 байта для остальных пяти цифр. Шесть дробные цифры требуют 3 байта.

(Отредактировано автором: 22 Июня, 2015 - 18:58:19)

 
 Top
Sail
Отправлено: 22 Июня, 2015 - 19:14:48
Post Id



Участник


Покинул форум
Сообщений всего: 1131
Дата рег-ции: Февр. 2014  


Помог: 57 раз(а)




LIME пишет:
лучше форматировать при выводе и все
...
А потом ловить глюки с числом -0, если услуга всё-таки должна предоставляться при нулевом балансе (в случае списания средств в начале расчетного периода)...
 
 Top
LIME
Отправлено: 22 Июня, 2015 - 19:17:46
Post Id


Активный участник


Покинул форум
Сообщений всего: 10732
Дата рег-ции: Нояб. 2010  


Помог: 322 раз(а)




Sail пишет:
А потом ловить глюки с числом -0
не понял, например? И причем тут округление до двух знаков?
(Добавление)
Sail ты децималом форматируешь чтоли???
 
 Top
LIME
Отправлено: 22 Июня, 2015 - 21:21:33
Post Id


Активный участник


Покинул форум
Сообщений всего: 10732
Дата рег-ции: Нояб. 2010  


Помог: 322 раз(а)




Sail ну интересно же! Признавайся что я не учел?
 
 Top
Sail
Отправлено: 22 Июня, 2015 - 22:49:45
Post Id



Участник


Покинул форум
Сообщений всего: 1131
Дата рег-ции: Февр. 2014  


Помог: 57 раз(а)




LIME, может и всё учёл... за кадром ведь остался формат хранения цен и правила их обработки...
Может, перед занесением в базу они округляются, может - нет...
Может, округление используется только для пользовательского вывода, может - нет...
Может, баланс пользователя хранится округлённым, может - нет...
А float-арифметика - такая хитрая штука...
 
 Top
LIME
Отправлено: 22 Июня, 2015 - 22:52:55
Post Id


Активный участник


Покинул форум
Сообщений всего: 10732
Дата рег-ции: Нояб. 2010  


Помог: 322 раз(а)




Sail пишет:
А float-арифметика - такая хитрая штука...
децимал арифметика проще?
Ну вот почему бы тебе не сказать что не знал о деталях хранения децимала?
Я сам об этом не так давно узнал
А юзал давно
Можно и децималом...но флоатом не хуже
Ооой....да все ты сам понял...
(Добавление)
Сволочи кто в русском варианте доков указал что децимал удобен для хранения денег!
Проклинаю!
Но не сильноУлыбка
 
 Top
Мелкий Супермодератор
Отправлено: 22 Июня, 2015 - 23:32:36
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




LIME пишет:
но флоатом не хуже

?!
С плавающей запятой деньги хранить нельзя.
Есть два варианта: хранить в копейках и обрабатывать руками в рубли, или хранить в decimal и обрабатывать штатными средствами.

LIME пишет:
Децимал это безразмерное для повышенной точности

Decimal - число с фиксированной точкой. В отличии от float, 0.001 * 1000 всегда равно 1 и другие прелести и грабли вычислений с фиксированной точностью.

LIME пишет:
Сволочи кто в русском варианте доков указал что децимал удобен для хранения денег!

Перевод как перевод. В оригинале так же сказано.


-----
PostgreSQL DBA
 
 Top
LIME
Отправлено: 22 Июня, 2015 - 23:38:53
Post Id


Активный участник


Покинул форум
Сообщений всего: 10732
Дата рег-ции: Нояб. 2010  


Помог: 322 раз(а)




Мелкий тогда проясни
Мелкий пишет:
С плавающей запятой деньги хранить нельзя.
пояснения будут?
Мелкий пишет:
и другие прелести и грабли вычислений с фиксированной точностью.
например?
Мелкий пишет:
Перевод как перевод. В оригинале так же сказано.
ткни...не нашел
Мелкий пишет:
вычислений с фиксированной точностью.
с повышеной точностью
То есть число хранится не теми байтами что занимает а гораздо более большим количеством байтов
Что тратит лишнии ресурсы когда этого не требуется
Очень хочу узнать где я не прав
(Добавление)
LIME пишет:
но флоатом не хуже
но флоатом лучше потому что ресурсов меньше жрет
Деньги не требуют повышеной точности
Так лучше?
(Добавление)
Мелкий кто мешает обрубать числа на входе из бд????
И не тратить в два раза больше ресурсов на хранение обычных чисел???
Хотя я буду удивлен если ты покажешь пример подводного камня хранения денег в флоатеУлыбка
Я не говорю о стомилиенов знаков после запятой
Это понятно
Давай говорить по сути
Децимал да или нет
Контролить на стороне приложения или децимал?
Я за первое
(Добавление)
Мелкий че молчишь? Прочитал что есть децимал на самом деле?УлыбкаУлыбка
 
 Top
DeepVarvar Супермодератор
Отправлено: 23 Июня, 2015 - 00:16:50
Post Id



Активный участник


Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008  
Откуда: Альфа Центавра


Помог: 353 раз(а)




LIME пишет:
но флоатом лучше потому что ресурсов меньше жрет
И эти люди говорят мне что я экономлю на спичках Все ходы записаны
 
 Top
LIME
Отправлено: 23 Июня, 2015 - 00:22:40
Post Id


Активный участник


Покинул форум
Сообщений всего: 10732
Дата рег-ции: Нояб. 2010  


Помог: 322 раз(а)




DeepVarvar децимал это не статичные поля - раз
Число занимает сколько занимает
Децимал не совсем число, это число у которого дохрена лишних байтов, при выборке по децимал полю это уже важно если много таких рядов
Я привел цитату и перевод
Недостаточно?
(Добавление)
DeepVarvar кто говорит? Где?
(Добавление)
DeepVarvar мелкий так и не ответил
Значит не все так просто как привыкли
 
 Top
MiksIr
Отправлено: 23 Июня, 2015 - 00:59:20
Post Id


Забанен


Покинул форум
Сообщений всего: 378
Дата рег-ции: Сент. 2014  


Помог: 10 раз(а)

[+]


Вооще-то он от этот "ответ" привел в своем первом посте. И это общеизвестный факт.
Работая с флоат всегда есть шанс "внезапно" словить что-то такое вот:
php > echo (int)(10.12*100);
1011

(Отредактировано автором: 23 Июня, 2015 - 00:59:37)



-----
self-banned
 
 Top
LIME
Отправлено: 23 Июня, 2015 - 01:01:07
Post Id


Активный участник


Покинул форум
Сообщений всего: 10732
Дата рег-ции: Нояб. 2010  


Помог: 322 раз(а)




MiksIr эээ....а при чем тут децимал?
Суть спора понял?
Это же и от децимала можно отловить
(Добавление)
Ну соберитесь ребята! Матиматики епрст
 
 Top
Страниц (3): [1] 2 3 »
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Вопросы новичков »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB