Как решить x ceiling(x) c = y, для x

#sql-server #math

#sql-сервер #математика

Вопрос:

Я работаю над проектом SQL Server, чтобы выполнить преобразование между двумя типами цен на автомобили (например, x — первоначальная цена, y — запрашиваемая цена дилера) на основе некоторых правил, так что для каждой запрашиваемой цены дилера y я могу получить соответствующую первоначальную цену x. Правило преобразования, с которым у меня возникли проблемы, заключается в следующем: x 5 * ceiling (x / 100) некоторая константа c = y, x =?

(На самом деле это скорее математическая задача. Например, если правило такое же простое, как x 10 = y, то x = y-10.)

Комментарии:

1. Недостаточно информации. Значения для X, которые будут удовлетворять любому заданному Y, будут занимать диапазон.

Ответ №1:

Действительно, это математическая задача, которую следует задать на Mathematics Stack Exchange.

Тем не менее, обратите внимание, что в уравнении x ceil(x) c = y, x и y-c отличаются только целым числом (которое зависит от x). И поскольку x ceil (x) является возрастающей функцией x, если есть решение, оно уникально.

Еще одно замечание:

  • для x в (0,1], x ceil (x) лежит в (1,2].
  • для x в (1,2], x ceil (x) лежит в (3,4].

То есть решение существует, только если y-c находится в (2n-1,2n] для некоторого целого числа n. И затем, x = y-c-n.

Как нам найти n? Ну, y-c в (2n-1,2 n] если (y-c) / 2 в (n-1/2, n]. Итак, у нас должно быть n = ceil((y-c)/ 2).


Это не намного сложнее для уравнения x 5ceil(x / 100) = y-c.

Теперь,

  • для x в (0,100], x 5ceil (x / 100) в (5,105]
  • для x в (100,200], x 5ceil (x / 100) в (110,210]
  • для x в (100(n-1), 100n], x 5ceil (x / 100) в (105 n-100,105n]

Опять же, некоторые значения не могут быть достигнуты, и если есть решение, оно уникально. И если y-c лежит в (105 n-100,105n] для некоторого n, то x = y-c-5n.

Конечно, вы хотите найти n. Обратите внимание, что y-c в (105 n-100,105n], если (y-c) / 105 находится в (n-100/105,n], что является подмножеством (n-1,n]. Итак, если есть решение, у вас должно быть n = ceil((y-c)/105).

Комментарии:

1. Большое вам спасибо! это потрясающе!

Ответ №2:

Не полный ответ, но для простого случая Y = X Ceiling (X)

 declare @X float = 3.7
declare @Y float = 0.0
SELECT @y = @x   ceiling(@x)


SELECT CASE 
            WHEN (@y -floor(@y)) = 0 THEN @y/2
            ELSE            (@y - (@y -floor(@y)) - 1)/2   (@y -floor(@y)) 
        END XValue
  

Это работает для всех значений X, которые я тестировал. Первый случай, когда X является целым числом.

Редактировать

Для вашего случая Y = X 5 * CEILING (X) / 100 мы можем предположить, что если X является целым числом, то Y = X 5/100 * X => 1,05 * X, если X не является целым числом, то y = X 5/100 (X 1) => 1,05 * X 0,05

Итак, я думаю, что для вашего случая работает следующее:

 declare @X float = 3.1
declare @Y float = 0.0
SELECT @y = @x   5*ceiling(@X)/100


SELECT CASE WHEN (ROUND(@y/1.05,0) = @y/1.05) THEN @y / 1.05
        ELSE ROUND((@y - 0.05) / 1.05,2) END
  

В вашем случае с константой я не вижу, как решить это, не зная константы.

Комментарии:

1. Спасибо за этот ответ! Но у меня возникли проблемы с обобщением на x 5 * ceiling (x / 100) некоторую константу c = y . Не могли бы вы дать мне несколько советов по этому вопросу?