Как вынудить c# двоичное международное подразделение возвратить двойное?

Как вызвать двойной 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

5
задан Wayne 21 March 2010 в 04:11
поделиться

8 ответов

Нет, не существует решения, которое может вернуть 3/2 1,5.

Единственный обходной путь с учетом ваших ограничений - это отговорить пользователей использовать литералы в формуле. Поощряйте их использовать константы. Или, если им действительно нужно использовать литералы, порекомендуйте им использовать литералы с десятичной точкой.

5
ответ дан 14 December 2019 в 13:32
поделиться

Одним из решений было бы написать метод, который сделает это за них и научит их использовать. Ваш метод всегда принимает двойные значения, и в ответе всегда будет правильное количество десятичных знаков.

0
ответ дан 14 December 2019 в 13:32
поделиться

Я не совсем уверен, но я считаю, что вы можете получить удвоение, используя 3.0 / 2.0 Но если вы думаете .0 точно так же другой способ суффикса, то это тоже не ответ: -)

0
ответ дан 14 December 2019 в 13:32
поделиться

Может быть, вы можете попробовать Класс синтаксического анализатора выражений RPN или ] bcParser ? Это очень маленькие библиотеки синтаксического анализа выражений.

Мне нравятся сильные, статически типизированные языки для моей собственной работы, но я не думаю, что они подходят для начинающих, которые не заинтересованы в становлении профессионалами.

Так что, к сожалению, я должен сказать, что ваш выбор C #, возможно, не был лучшим для этой аудитории.

Boo, похоже, статически типизирован. Вы думали о внедрении движка Javascript, Python или другого движка с динамической типизацией? Обычно их не так сложно подключить к существующему приложению, и вы можете воспользоваться большим количеством существующей документации.

0
ответ дан 14 December 2019 в 13:32
поделиться

Возможно, метод расширения на int32?

0
ответ дан 14 December 2019 в 13:32
поделиться

Предварительно обработайте формулы перед их передачей в компилятор C #. Сделайте что-нибудь вроде:

formula = Regex.Replace(formula, @"(^|[\^\s\+\*\/-])(\d+)(?![DF\.])", "$1$2D")

Чтобы преобразовать целочисленные литералы в двойные литералы.

В качестве альтернативы вы можете использовать простой конечный автомат, чтобы отслеживать, находитесь ли вы в строковом литерале или комментарии, а не заменяете его вслепую, но для простых формул, я думаю, будет достаточно регулярного выражения.

0
ответ дан 14 December 2019 в 13:32
поделиться

просто, если я не ошибаюсь:

double x = 3D / 2D;
0
ответ дан 14 December 2019 в 13:32
поделиться

Попробуйте сделать это так:

double result = (double) 3 / 2;

result = 1.5

0
ответ дан 14 December 2019 в 13:32
поделиться
Другие вопросы по тегам:

Похожие вопросы: