Как вызвать двойной x = 3 / 2; возвратиться 1.5 в x без суффикса D или кастинга? Действительно ли там кто-либо - вид перегрузки оператора, которая может быть сделана? Или некоторый параметр компилятора?
Удивительно, не настолько просто добавить кастинг или суффикс по следующей причине:
Бизнес-пользователи должны записать и отладить свои собственные формулы. В настоящее время C# привыкает как DSL (предметно-ориентированный язык) в этом, эти пользователи не являются инженерами информатики. Таким образом, все, что они знают, - то, как отредактировать и создать несколько типов классов для содержания их "бизнес-правил", которые являются обычно просто математическими формулами.
Но они всегда предполагают что двойной x = 3 / 2; возвратит x = 1.5 однако в C#, который возвращается 1.
A. они всегда забывают это, напрасно тратят время, отлаживая, звонят мне для поддержки, и мы фиксируем ее. B. они думают, что это очень ужасно и повреждает удобочитаемость их бизнес-правил.
Как Вы знаете, потребность DSL больше быть похожими на естественный язык.
Да. Мы планируем переместиться в Шиканье и создать DSL на основе его, но это в будущем.
Есть ли простое решение для создания двойного x = 3 / 2; возвратитесь 1.5 чем-то внешним к классу, таким образом, это невидимо для пользователей?
Спасибо! Wayne
Нет, не существует решения, которое может вернуть 3/2
1,5.
Единственный обходной путь с учетом ваших ограничений - это отговорить пользователей использовать литералы в формуле. Поощряйте их использовать константы. Или, если им действительно нужно использовать литералы, порекомендуйте им использовать литералы с десятичной точкой.
Одним из решений было бы написать метод, который сделает это за них и научит их использовать. Ваш метод всегда принимает двойные значения, и в ответе всегда будет правильное количество десятичных знаков.
Я не совсем уверен, но я считаю, что вы можете получить удвоение, используя 3.0 / 2.0 Но если вы думаете .0 точно так же другой способ суффикса, то это тоже не ответ: -)
Может быть, вы можете попробовать Класс синтаксического анализатора выражений RPN или ] bcParser ? Это очень маленькие библиотеки синтаксического анализа выражений.
Мне нравятся сильные, статически типизированные языки для моей собственной работы, но я не думаю, что они подходят для начинающих, которые не заинтересованы в становлении профессионалами.
Так что, к сожалению, я должен сказать, что ваш выбор C #, возможно, не был лучшим для этой аудитории.
Boo, похоже, статически типизирован. Вы думали о внедрении движка Javascript, Python или другого движка с динамической типизацией? Обычно их не так сложно подключить к существующему приложению, и вы можете воспользоваться большим количеством существующей документации.
Предварительно обработайте формулы перед их передачей в компилятор C #. Сделайте что-нибудь вроде:
formula = Regex.Replace(formula, @"(^|[\^\s\+\*\/-])(\d+)(?![DF\.])", "$1$2D")
Чтобы преобразовать целочисленные литералы в двойные литералы.
В качестве альтернативы вы можете использовать простой конечный автомат, чтобы отслеживать, находитесь ли вы в строковом литерале или комментарии, а не заменяете его вслепую, но для простых формул, я думаю, будет достаточно регулярного выражения.
Попробуйте сделать это так:
double result = (double) 3 / 2;
result = 1.5