За последние 24 часа нас посетили 38006 программистов и 1811 роботов. Сейчас ищут 853 программиста ...

не правильно php складывает числа

Тема в разделе "PHP для новичков", создана пользователем Dron-Boy, 13 апр 2018.

  1. Dron-Boy

    Dron-Boy Старожил

    С нами с:
    20 ноя 2014
    Сообщения:
    1.041
    Симпатии:
    126
    че за на?
    пишу
    11.1 + 0.1 = 12.2
    почему так?
    оба числа получаю с БД. пытался привести насильно к float
    PHP:
    1. ((float)$res2[0]->rating_total) + ((float)$cost_user)
    в итоге тот же результат.
     
  2. Sail

    Sail Старожил

    С нами с:
    1 ноя 2016
    Сообщения:
    1.593
    Симпатии:
    362
    var_dump() каждой переменной перед операцией сложения, код операции сложения и код вывода результата в студию...
     
  3. Abyss

    Abyss Старожил

    С нами с:
    12 дек 2015
    Сообщения:
    1.298
    Симпатии:
    218
    Адрес:
    Default city
  4. Dron-Boy

    Dron-Boy Старожил

    С нами с:
    20 ноя 2014
    Сообщения:
    1.041
    Симпатии:
    126
    вот вардамп
    странно он считает их строками
    хотя я только что зашел и поменял с varchar на float в бд

    string(5) "100.8" string(3) "0.1" float(100.9)
     
  5. Abyss

    Abyss Старожил

    С нами с:
    12 дек 2015
    Сообщения:
    1.298
    Симпатии:
    218
    Адрес:
    Default city
  6. Dron-Boy

    Dron-Boy Старожил

    С нами с:
    20 ноя 2014
    Сообщения:
    1.041
    Симпатии:
    126
    Вручную привел к float
    вот вардамп
    PHP:
    1. float(100.7) float(0.1) float(100.8)
    и прикол в том что он первый раз сохраняет на 1 больше тоисть 100.7 + 0.1 = 101.8 а на второй раз сохраняет 100.7 + 0.1 = 100.8
    --- Добавлено ---
    не помогает. Ладно обойдусь без дробных чисел, баг какойто видимо
     
  7. Sail

    Sail Старожил

    С нами с:
    1 ноя 2016
    Сообщения:
    1.593
    Симпатии:
    362
    @Dron-Boy, во-первых, например, fetch_array() и им подобных "Возвращает массив строк соответствующих выбранной строке набора".
    То есть, независимо от типа поля в базе - в результате получаешь строку и уже с ней работаешь.
    Во-вторых, не float($var), а (float)$var. Таков синтаксис приведения типов
    В-третьих, арифметика с float, конечно, выполняется с погрешностью ввиду особенностей машинного представления, но не с такой большой...
    Так-что ошибка где-то ещё...
    --- Добавлено ---
    И если уж хранить в базе числа с точностью до n-го знака, то предпочтительнее формат decimal
     
  8. Dron-Boy

    Dron-Boy Старожил

    С нами с:
    20 ноя 2014
    Сообщения:
    1.041
    Симпатии:
    126
    это я знаю. писал правльно.
    И да я затупил в двух местах вносил новые данные в бд. так что плюсовалось все ок.