За последние 24 часа нас посетили 22565 программистов и 1017 роботов. Сейчас ищут 770 программистов ...

Лишний ноль справа у NUMERIC

Тема в разделе "PHP и базы данных", создана пользователем minux, 25 окт 2020.

Метки:
  1. minux

    minux Активный пользователь

    С нами с:
    14 май 2012
    Сообщения:
    89
    Симпатии:
    1
    При внесении в базу данных значения 0.00001 (или меньше) справа есть лишний ноль.
    Тип данных этого поля в базе Postgresql - NUMERIC.

    Руками, через терминал, INSERT в базу - нет лишнего ноля справа.
    PHP, используя pg_query_params() - есть лишний ноль справа.

    PHP:
    1. <?php
    2.  
    3. #условная "копейка" (0.01) дробится ещё на миллион (0.00 000 001)
    4.  
    5. define('KNBBET1', 0.00000100); //сто
    6. define('KNBBET2', 0.00001000); //тысяча
    7. define('KNBBET3', 0.00010000); //десять тысяч
    8.  
    9. echo gettype(KNBBET1).' '.KNBBET1."\n"; //double 1.0E-6 (лишний ноль справа)
    10. echo gettype(KNBBET2).' '.KNBBET2."\n"; //double 1.0E-5 (лишний ноль справа)
    11. echo gettype(KNBBET3).' '.KNBBET3."\n"; //double 0.0001 (нет лишнего ноля)
    12.  
    13. ?>
    Почему появляется лишний ноль справа?
     
  2. Drunkenmunky

    Drunkenmunky Активный пользователь

    С нами с:
    12 авг 2020
    Сообщения:
    1.476
    Симпатии:
    281
  3. minux

    minux Активный пользователь

    С нами с:
    14 май 2012
    Сообщения:
    89
    Симпатии:
    1
  4. Drunkenmunky

    Drunkenmunky Активный пользователь

    С нами с:
    12 авг 2020
    Сообщения:
    1.476
    Симпатии:
    281
    Тогда покажите структуру таблицы.
     
  5. minux

    minux Активный пользователь

    С нами с:
    14 май 2012
    Сообщения:
    89
    Симпатии:
    1
    Создание таблицы (строка 3)
    Код (Text):
    1. CREATE TABLE rock_scissors_paper (
    2.     game_id BIGSERIAL NOT NULL PRIMARY KEY,
    3.     bet NUMERIC NOT NULL,
    4.     creater_id BIGINT NOT NULL,
    5.     creater_invite_id BIGINT,
    6.     creater_turn VARCHAR(255) NOT NULL,
    7.     player_id BIGINT,
    8.     player_invite_id BIGINT,
    9.     winner_id BIGINT
    10. );
    Вставка в таблицу
    PHP:
    1. $bet = 0.00001; //столько (или меньше) образует ноль справа
    2. $_SESSION['user_id'] = 3;
    3. $_SESSION['invite'] = NULL;
    4. $turn = 'scissors';
    5.  
    6.    INSERT INTO rock_scissors_paper
    7.    (bet, creater_id, creater_invite_id, creater_turn)
    8.    VALUES ($2, $1, $3, $4)
    9.    ',
    10.     array(
    11.         $_SESSION['user_id'], //игрок
    12.         doubleval($bet), //ставка
    13.         $_SESSION['invite'], //рефовод
    14.         $turn //ход
    15.     )
    16. );
    Содержимое таблицы (столбец 2)
    Код (Text):
    1. select * from rock_scissors_paper;
    2. game_id |    bet    | creater_id | creater_invite_id | creater_turn | player_id | player_invite_id | winner_id
    3. ---------+-----------+------------+-------------------+--------------+-----------+------------------+-----------
    4.        1 |  0.000010 |          3 |                   | scissors     |           |                  |            
    5. (1 row)
     
  6. Drunkenmunky

    Drunkenmunky Активный пользователь

    С нами с:
    12 авг 2020
    Сообщения:
    1.476
    Симпатии:
    281
    А если без doubleval()?
     
  7. Drunkenmunky

    Drunkenmunky Активный пользователь

    С нами с:
    12 авг 2020
    Сообщения:
    1.476
    Симпатии:
    281
    Вот, что происходит.
    Сравните
    PHP:
    1. <?php
    2. $bet = 0.00001;
    3. printf('%s', $bet);
    4. echo '<br />';
    5. printf('%f', $bet);
    6. ?>
    и
    PHP:
    1. <?php
    2. $bet = '0.00001';
    3. printf('%s', $bet);
    4. echo '<br />';
    5. printf('%f', $bet);
    6. ?>
    То есть, если $bet в ячейку нужно записать именно как 0.00001, то подавайте его как строку.
     
    #7 Drunkenmunky, 26 окт 2020
    Последнее редактирование: 26 окт 2020
  8. minux

    minux Активный пользователь

    С нами с:
    14 май 2012
    Сообщения:
    89
    Симпатии:
    1
    Пробовал, пусть это и не строго и риск обделаться. Не прокатило.
    И получить отказ от базы, по тому что база принимает NUMERIC.
     
  9. Drunkenmunky

    Drunkenmunky Активный пользователь

    С нами с:
    12 авг 2020
    Сообщения:
    1.476
    Симпатии:
    281
    Попробуйте
    Код (Text):
    1. INSERT INTO `rock_scissors_paper` (`bet`
    2. )
    3. VALUES ('1234.123456'
    4. )