Ваше первое решение кажется более безопасным, а также кажется концептуально более близким к проблеме: преобразование как можно скорее из числа с плавающей запятой в десятичное, все соответствующие вычисления в десятичном виде, а затем в последнюю минуту преобразование обратно в число с плавающей запятой перед записью в БД.
Редактировать: Вам, вероятно, все еще нужно будет сделать дополнительный раунд (например, до 3 десятичных знаков или любого другого, подходящего для вашего приложения) сразу после получения значения с плавающей запятой и преобразования в десятичную, чтобы убедиться, что вы в конечном итоге получите десятичное значение, которое было на самом деле предназначено. 6.925e0
преобразованное в десятичное число снова вероятно (при условии, что десятичный формат имеет> 16 цифр точности), чтобы получить что-то, что очень близко, но не точно равно, 6.925
; об этом позаботится дополнительный раунд.
Второе решение не выглядит для меня надежным: что, если из-за обычных двоичных проблем с плавающей запятой сохраненное значение для 6.925e0
окажется слишком маленьким? Затем после умножения на 1000
результат может все еще быть касанием ниже 6925
, так что шаг округления округляется вниз, а не вверх. Если вы знаете, что ваше значение всегда имеет не более 3 цифр после точки, вы можете исправить это, выполнив дополнительный раунд после умножения на 1000, что-то вроде ROUND(ROUND(x * 1000, 0), -1)
.
(Отказ от ответственности: хотя у меня есть большой опыт работы с проблемами с плавающей запятой и десятичными числами в других контекстах, я почти ничего не знаю о SQL.)