Округление десятичных дробей

Тема в разделе "Базы данных", создана пользователем Qwest-fx, 14 апр 2014.

Модераторы: latteo
  1. Qwest-fx

    Qwest-fx Постоялец

    Регистр.:
    3 апр 2007
    Сообщения:
    129
    Симпатии:
    39
    PHP:
    -- --------------------------------------------------------
    -- 
    Хост:                         127.0.0.1
    -- Версия сервера:               5.5.36-MariaDB MariaDB Server
    -- ОС Сервера:                   Linux
    -- HeidiSQL Версия:              8.3.0.4694
    -- --------------------------------------------------------

    /*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
    /*!40101 SET NAMES utf8 */;
    /*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
    /*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;

    -- 
    Дамп структуры базы данных test_float
    CREATE DATABASE 
    IF NOT EXISTS `test_float/*!40100 DEFAULT CHARACTER SET utf8 */;
    USE `
    test_float`;


    -- 
    Дамп структуры для таблица test_float.test
    CREATE TABLE 
    IF NOT EXISTS `test` (
      `
    idint(11NOT NULL AUTO_INCREMENT,
      `
    afloat NOT NULL,
      
    PRIMARY KEY (`id`)
    ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=utf8;

    -- 
    Дамп данных таблицы test_float.test: ~10 rows (приблизительно)
    /*!40000 ALTER TABLE `test` DISABLE KEYS */;
    INSERT INTO `test` (`id`, `a`) VALUES
        
    (10.001),
        (
    20.002),
        (
    30.003),
        (
    40.004),
        (
    50.005),
        (
    60.006),
        (
    70.007),
        (
    80.008),
        (
    90.009),
        (
    100.015);
    /*!40000 ALTER TABLE `test` ENABLE KEYS */;
    /*!40101 SET SQL_MODE=IFNULL(@OLD_SQL_MODE, '') */;
    /*!40014 SET FOREIGN_KEY_CHECKS=IF(@OLD_FOREIGN_KEY_CHECKS IS NULL, 1, @OLD_FOREIGN_KEY_CHECKS) */;
    /*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;

    Пример запроса с округлением
    PHP:
    select *, round(`a`,2) as 'round' from test
    Результат
    [​IMG]

    Второй пример запроса с использованием округления
    PHP:
    select round(0.015,2)
    [​IMG]

    Знающие люди объясните в чем разница?
    Как округлять числа до 2х знаков по правилам математического округления?
     
    Последнее редактирование: 18 май 2015
  2. latteo

    latteo Эффективное использование PHP, MySQL

    Moderator
    Регистр.:
    28 фев 2008
    Сообщения:
    1.451
    Симпатии:
    1.245
    С округлением флоатов не только в mysql проблемы.
    Возможно вот этот костыль прояснит немного ситуацию:
    Код:
    select *, round(`a`, 10), round(round(`a`, 3), 2) as 'round' from test
    

    http://www.sql.ru/forum/105453/problema-s-mysql-okruglenie
     
  3. codeator

    codeator Постоялец

    Регистр.:
    18 май 2013
    Сообщения:
    53
    Симпатии:
    14
    Попробуйте
    select cast(a as decimal(10,2));
     
    latteo нравится это.
  4. Qwest-fx

    Qwest-fx Постоялец

    Регистр.:
    3 апр 2007
    Сообщения:
    129
    Симпатии:
    39
    [​IMG]
    [​IMG]
    Так и в чём разница?
    Даже так
    select cast('0.015' as decimal(10,2)) as 'cast'
     
  5. codeator

    codeator Постоялец

    Регистр.:
    18 май 2013
    Сообщения:
    53
    Симпатии:
    14
    Я почитал, погонял тесты, и понял!

    ALTER TABLE `test` CHANGE `a` `a` DECIMAL (5,3) NOT NULL;