Должен ли я использовать decimal, float или double для этого простого математического результата?
-
19-08-2019 - |
Вопрос
Я выполняю действительно простую математику и сохраняю результат в базе данных MS SQL2008.
I'm усреднение выведите несколько чисел, которые являются байтовыми значениями между 1<->5.Я хочу записать, вероятно, только 2 знака после запятой.Меня не волнует округление до 2-го знака после запятой (например.а 1,155 == 1,5 или 1,6 ..я не слишком разбираюсь в фазах).
Итак ..должен ли я хранить средний результат в виде числа с плавающей запятой, десятичной или двойной?
Когда я проверяю, что возвращает LINQ, он может возвращать все три значения!
Наконец, каким также было бы соответствующее поле SQL datatype.
ваше здоровье!
Решение
Что вам нужно, так это ДЕСЯТИЧНЫЙ тип данных:
declare @val decimal(10,2)
select @val = 10.155
select @val
При вводе значений вы можете либо полагаться на встроенное округление, либо явно решить, какое округление вы хотите:
select val = round(10.155, 2, 0) -- rounded
select val = round(10.155, 2, 1) -- truncated
Десятичное число (10,2) означает, что можно использовать десять цифр, и что две из них следует считать стоящими после запятой.т. е.Наибольшее число, которое может содержать десятичная дробь (4,2), равно 99,99.Попытка установить его равным 100 приведет к арифметическому переполнению.
Другие советы
Я бы выбрал Float вместо Double и, вероятно, Float вместо Decimal:.Я бы выбрал Float, Хотя все они должны давать одинаковый результат.
Взгляните на эти две страницы для Плавает & Десятичные дроби
Десятичная дробь в основном используется для обозначения валюты.Хотя это и сработало бы, людей это могло бы сбить с толку.В этом случае я думаю, что float был бы лучшим выбором.
Десятичный - это самый простой, однако любой из перечисленных способов справится с этой задачей
Если вы хотите сохранить результаты, используя как можно меньше места, вы, вероятно, могли бы сделать что-то вроде этого (псевдокод):
integer = ( sum(all_values) / all_values.count().float ) * 100;
Это даст вам значение 352 в среднем за 3,52, так что вы можете сохранить его как целое число (я думаю, байт будет достаточно большим) и просто разделить его на 100, когда захотите его отобразить.
С другой стороны, если вы не заботитесь о сохранении среднего значения, использование значений с плавающей запятой, возможно, быстрее.(Протестируйте оба варианта, чтобы увидеть, какой из них на самом деле самый быстрый в вашей системе.)