Добро пожаловать на Pro Pawn - Портал о PAWN-скриптинге.
Показано с 1 по 10 из 10
  1. #1
    Аватар для Paradox
    Пользователь

    Статус
    Оффлайн
    Регистрация
    08.06.2015
    Адрес
    Запорожье
    Сообщений
    117
    Репутация:
    1 ±

    Почему MySQL неправильно показывает число после точки для Float-значений?

    Доброе время суток, вообще возник вопрос, почему в базу данных записывает float до точки?
    Допустим из:
    PHP код:
    -800.350500 
    В базе данных будет так:
    PHP код:
    -800 
    Запись происходит так:
    PHP код:
    new str[64], Floatpx;
    GetPlayerPos(playeridpx__);
    format(str64"INSERT INTO `test` (`px`) VALUES ('%f')"px);
    mysql_function_query(querystrfalse""""); 
    Почему так? и как сделать так что бы записывало полностью, то что после точки тоже..

  2. #2
    Аватар для whale
    Пользователь

    Статус
    Оффлайн
    Регистрация
    10.04.2014
    Сообщений
    74
    Репутация:
    17 ±
    PHP код:
    %0.xf 
    x - количество знаков, которые будут выведены после запятой.

  3. #3
    Аватар для ziggi
    Проверенный

    Статус
    Оффлайн
    Регистрация
    14.05.2015
    Сообщений
    1,181
    Репутация:
    790 ±
    Какой тип у этого поля в таблице?

  4. #4
    Аватар для Paradox
    Пользователь

    Статус
    Оффлайн
    Регистрация
    08.06.2015
    Адрес
    Запорожье
    Сообщений
    117
    Репутация:
    1 ±
    float (lenght 12), если имеет значение то engine InnoDB (format row compact), дело в том что работаю с базами mysql первый раз..

    - - - Добавлено - - -

    сомневаюсь что оно поможет дело в том что в из GetPlayerPos в переменную записывает корректно, то бишь уже в саму базу запись идет таков.

  5. #5
    Аватар для ziggi
    Проверенный

    Статус
    Оффлайн
    Регистрация
    14.05.2015
    Сообщений
    1,181
    Репутация:
    790 ±
    Цитата Сообщение от Paradox Посмотреть сообщение
    float (lenght 12), если имеет значение то engine InnoDB (format row compact), дело в том что работаю с базами mysql первый раз..

    - - - Добавлено - - -

    сомневаюсь что оно поможет дело в том что в из GetPlayerPos в переменную записывает корректно, то бишь уже в саму базу запись идет таков.
    А запрос на сохранение/добавление как выглядит?
    Последний раз редактировалось ziggi; 15.06.2018 в 10:23.

  6. #6
    Аватар для Paradox
    Пользователь

    Статус
    Оффлайн
    Регистрация
    08.06.2015
    Адрес
    Запорожье
    Сообщений
    117
    Репутация:
    1 ±
    Это добавление через cmd:
    PHP код:
        new str[64], Floatpx
        
    GetPlayerPos(playeridpx__);
        
    format(strsizeof(str), "INSERT INTO `test` (`ID`, `px`) VALUES ('%d', '%f')"idpx);
        
    mysql_function_query(querystrfalse""""); 
    Загрузка:
    PHP код:
        IDS cache_get_field_content_int(i"ID"query);
        
    Pos_X cache_get_field_content_float(i"px"query); 
    Сохранение:
    PHP код:
    format(strsizeof(str), "UPDATE `test` SET  px = '%f' WHERE `ID` = '%d'"Pos_XIDS);
    mysql_function_query(querystrfalse""""); 
    - - - Добавлено - - -

    Ах, да не знаю имеет какое-то значение или MySQL R39-6 стоит.

  7. #7
    Аватар для ziggi
    Проверенный

    Статус
    Оффлайн
    Регистрация
    14.05.2015
    Сообщений
    1,181
    Репутация:
    790 ±
    Даже не знаю, было подобное, помогло изменение типа на double.

  8. #8
    Аватар для DeimoS
    Модератор?

    Статус
    Оффлайн
    Регистрация
    27.01.2014
    Адрес
    Восточный Мордор
    Сообщений
    5,588
    Репутация:
    1984 ±
    Попробуй вывести так:
    PHP код:
    SELECT format(/*тут столбец с твоим значением*/7FROM таблица 
    Если в первом посте ты привёл лишь пример, который сочинил на ходу, а на деле говоришь о том, что в базе значение округляется, то "проблема" заключается в том, что ты не указываешь сколько знаков после точки нужно отображать, а по умолчанию в MySQL выводит, если мне память не изменяет, только два знака после точки. Когда ты делаешь запрос на отображение значения, MySQL не просто отображает число, обрубая все "лишние" значения после точки, а преобразует его в тот вид, который требуется (соответственно, округляя).

    А вообще, если нужна точность, то следует использовать тип "Decimal", ибо в MySQL типы "Float" и "Double" хранят приблизительные значения числа (об этом написано тут) и связано это с тем, что в MySQL для обработки Float-значений используется стандарт IEEE 754, о котором можешь почитать в википедии.

    - - - Добавлено - - -

    UPD: Кстати, говоря о Decimal, забыл упомянуть, что вывести данные можно и так:
    PHP код:
    SELECT cast(/*тут столбец с твоим значением*/ AS decimal(96)) FROM `таблица
    Если вкратце, то тут ты переводишь из Float в Decimal, указывая в "decimal(16, 6)", что всего нужно отобразить 16 знаков, из которых 6 знаков будут после точки.
    "16" там стоит из расчёта на то, что 10 символов может быть до точки и 6 символов после. Если указать, например, "7, 6", а в столбце окажется значение "11.123456", то MySQL уже вернёт неправильное значение (обычно это отрицательное число, состоящее из всех девяток. И количество девяток до/после точки будет зависеть от той "формулы", которую ты указал в скобках после decimal. Для запроса с "decimal(7, 6)" и значением столбца в "11.123456", MySQL вернёт "-9,999999", а для "decimal(6, 6) вернёт "-0,999999"")
    Связаться со мной в VK можно через личные сообщения этой группы
    Заказы не принимаю

    Широко известно, что идеи стоят 0.8333 цента каждая (исходя из рыночной цены 10 центов за дюжину).
    Великих идей полно, на них нет спроса.
    Воплощение идеи в законченную игру требует долгой работы,
    таланта, терпения и креативности, не говоря уж о затратах денег, времени и ресурсов.
    Предложить идею просто, воплотить – вот в чём проблема

    Steve Pavlina

  9. #9
    Аватар для Paradox
    Пользователь

    Статус
    Оффлайн
    Регистрация
    08.06.2015
    Адрес
    Запорожье
    Сообщений
    117
    Репутация:
    1 ±
    Цитата Сообщение от DeimoS Посмотреть сообщение
    Попробуй вывести так:
    PHP код:
    SELECT format(/*тут столбец с твоим значением*/7FROM таблица 
    Если в первом посте ты привёл лишь пример, который сочинил на ходу, а на деле говоришь о том, что в базе значение округляется, то "проблема" заключается в том, что ты не указываешь сколько знаков после точки нужно отображать, а по умолчанию в MySQL выводит, если мне память не изменяет, только два знака после точки. Когда ты делаешь запрос на отображение значения, MySQL не просто отображает число, обрубая все "лишние" значения после точки, а преобразует его в тот вид, который требуется (соответственно, округляя).

    А вообще, если нужна точность, то следует использовать тип "Decimal", ибо в MySQL типы "Float" и "Double" хранят приблизительные значения числа (об этом написано тут) и связано это с тем, что в MySQL для обработки Float-значений используется стандарт IEEE 754, о котором можешь почитать в википедии.

    - - - Добавлено - - -

    UPD: Кстати, говоря о Decimal, забыл упомянуть, что вывести данные можно и так:
    PHP код:
    SELECT cast(/*тут столбец с твоим значением*/ AS decimal(96)) FROM `таблица
    Если вкратце, то тут ты переводишь из Float в Decimal, указывая в "decimal(16, 6)", что всего нужно отобразить 16 знаков, из которых 6 знаков будут после точки.
    "16" там стоит из расчёта на то, что 10 символов может быть до точки и 6 символов после. Если указать, например, "7, 6", а в столбце окажется значение "11.123456", то MySQL уже вернёт неправильное значение (обычно это отрицательное число, состоящее из всех девяток. И количество девяток до/после точки будет зависеть от той "формулы", которую ты указал в скобках после decimal. Для запроса с "decimal(7, 6)" и значением столбца в "11.123456", MySQL вернёт "-9,999999", а для "decimal(6, 6) вернёт "-0,999999"")
    Пример я сочинил, на ходу, верно зачем мне скидывать полный код с ++ строк если его можно описать в краце, тем более суть все поняли, дело тут не в сохранении даже а в том что запись изначально идет до точки, но я понял тебя, попробую, спасибо.

    - - - Добавлено - - -

    отпишусь

    - - - Добавлено - - -

    Что-то я не очень понял походу.. как правильно записывать все ибо у меня нечего не получилось..

    - - - Добавлено - - -

    Разобрался, close theme..
    Последний раз редактировалось DeimoS; 16.06.2018 в 10:55.

  10. #10
    Аватар для DeimoS
    Модератор?

    Статус
    Оффлайн
    Регистрация
    27.01.2014
    Адрес
    Восточный Мордор
    Сообщений
    5,588
    Репутация:
    1984 ±
    Записывать как и раньше (если Float), а получать нужно указывая количество знаков после точки.
    Закрыто.
    Связаться со мной в VK можно через личные сообщения этой группы
    Заказы не принимаю

    Широко известно, что идеи стоят 0.8333 цента каждая (исходя из рыночной цены 10 центов за дюжину).
    Великих идей полно, на них нет спроса.
    Воплощение идеи в законченную игру требует долгой работы,
    таланта, терпения и креативности, не говоря уж о затратах денег, времени и ресурсов.
    Предложить идею просто, воплотить – вот в чём проблема

    Steve Pavlina

 

 

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •