Почему MySQL округляет 2 десятичных числа до неисключенного значения?

У меня есть таблица со следующими данными:

Площадь ВАРЧАР(50), ДЕСЯТИЧНЫЙ доход (20,2), Расход ДЕСЯТИЧНЫЙ (20,2), DECIMAL (6,2)

Эти значения были импортированы из электронной таблицы, а выставленный процент недостаточно точен. Округляется до 2 знаков после запятой. Я могу рассчитать его, взяв доход / расход, но я не получаю ожидаемого значения.

Выберите * из вернет «Счетчик», -1822,90, 2749,63, 0,66

-1822,90 / 2749,63 = -0,6629619.... абсолютное значение которого будет округлено до 66,3%, что является необходимой мне точностью.

Так почему же тогда, когда я запускаю следующий запрос: Выберите область, (доход / расход) AS calcPercentBilled, PercentBilled из

Я получаю: «Счетчик, -1822,90, 2749,63, 1,000000, 0,66?

Я предполагаю, что это что-то странное с MySQL и типами, но я не могу понять, что происходит. Почему MySQL округляет деление двух десятичных чисел в запросе до 1.000000?

Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
В предыдущем посте мы создали функциональность вставки и чтения для нашей динамической СУБД. В этом посте мы собираемся реализовать функции обновления...
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Роли и разрешения пользователей без пакета Laravel 9
Роли и разрешения пользователей без пакета Laravel 9
Этот пост изначально был опубликован на techsolutionstuff.com .
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
0
0
410
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Проблема заключается в типе данных, который вы указали для PercentBilled. DECIMAL(6,2) означает сохранить значение с 6 цифрами с 2 из них после запятой. Поэтому, чтобы повысить точность хранимого значения, вам нужно изменить тип столбца, возможно, на DECIMAL(9,6). Это позволит сохранить значение в вашем примере как «0,662962» (т.е. шесть знаков после запятой).

Обратите внимание, что простое обновление типа столбца не изменит недостающую точность, если вы повторно не импортируете данные из источника. Простое изменение типа данных без повторной загрузки данных изменит его на «0,660000».

Может быть, я был недостаточно конкретен. Я знаю, о чем вы говорите, но я пытаюсь вычислить другие цифры после 0,66 в запросе на выборку, потому что в электронной таблице будет только 2 цифры точности. Я до сих пор не знаю, почему запрос выбора округляется до 1,00000 вместо 0,6629619.

user2792749 23.12.2020 20:10

ну, в MySQL 5.7, если я сделаю то же самое, я получу «0,662962». т. е. создать таблицу foo (x decimal (20,2), y decimal (20,2)); вставить в foo значения (-1822,90, 2749,63); выберите (x/y) как z из foo; дает z = 0,662912 какую версию MySQL и какой клиентский инструмент вы используете?

MNB 23.12.2020 20:24

Еще одна вещь: у вас появляется «1.00000» (т.е. +1), но одно из ваших чисел отрицательное, поэтому ответ также должен быть отрицательным. Вы уверены, что случайно не разделили столбец? как «выбрать (x/x) как z из foo» в приведенном выше примере дает z = 1,000000

MNB 23.12.2020 20:26

Хорошо, я ID710T. Это был не тот столбец, но это был неправильный столбец. Я заметил это после того, как расширил запрос до нескольких областей, и были другие значения, которые также указывали на это.

user2792749 23.12.2020 20:35

Рад был помочь. Часто просто задать вопрос заставляет вас прочитать все заново.

MNB 23.12.2020 20:36

Другие вопросы по теме