2016-12-14 3 views
-1
Boolean Multiplier; 
double Number; 
double Value; 
string Text; 
Text = (Value * (1 + (Convert.ToInt32(Multiplier)/2)).ToString(".0##"); 

Это текущий код, который я отведенный вниз к общему поведению с предполагаемым поведением стоимости умножается на 1.5, если мультипликатор верно и значение остается теми же самым, если мультипликатор ложный.Выберите коэффициент зависит от логического значения C#

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

+1

Вы можете использовать оператор [ternary] (https://msdn.microsoft.com/en-gb/library/ty67wk28.aspx) 'Value * = Multplier? 1.5: 1; ' ' Text = Value.ToString (". 0 ##"); 'альтернативно использовать if с той же логикой –

+0

Спасибо, это именно то, что я хотел. Вы бы получили галочку, но, к сожалению, ее комментарий:/ – Firro

+0

На самом деле это не стоило ответа, поэтому я не беспокоился: P –

ответ

1

Вы должны (ИМХО) не использовать преобразование булевой .. в целое (или любой другой тип) Он полагается на любой неявного знания правил преобразования и/или чтение документации

Ваше требование:

Текст Значение умноженная на 1,5, если множитель равен true, а значение остается неизменным, если множитель - false, преобразован в строку.

Так почему бы не просто закодировать это таким образом, используя стандартный тройной оператор:

Text = (Multiplier ? Value * 1.5 : Value).ToString(".0##"); 

Или какой-нибудь вариант, если вам не нравится, ссылка на Value дублируется.

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

+0

Почему он не должен преобразовывать его из bool, https://msdn.microsoft.com/en-us/library/9y5sh618(v=vs.110).aspx ничего не говорит об этом. – mybirthname

+0

@mybirthname Моя точка зрения не очевидна, что 'true == 1' и' false == 0', если вы давно не программировали или не помнили документированное поведение. Кроме того, вы должны затем применить это к уравнению, чтобы понять, что происходит _actually_. Кто-то, читающий код в первый раз, должен подумать о том, что он делает (и может ошибиться). Код _Good_ легко читается, понимает и объясняет другим. –

+0

В качестве побочного примечания я делаю тот же аргумент при упорядочении по логическим значениям - мне не нравится думать о том, что на первом месте, поэтому я делаю его явным (например, 'OrderBy (o => o.isValid? 0: 1) 'versus' OrderBy (o =>! o.isValid') Нет истинного и ложного порядка _natural_ - это то, как Computer Science определила его в течение многих лет. –

1

Вы можете просто использовать if заявление:

double val = Value; 
if(Multiplier) 
{ 
    val = val * 1.5; 
} 
Text = val.ToString(".0##"); 
+0

Я не хочу использовать его таким образом, потому что, если я решит добавить больше множителей к тем же Формула Я должен был бы сделать гнездо ifs и elses. – Firro

+0

@Firro nesting '?' Гораздо сложнее читать, чем вложенные 'if's. Если вы добавили несколько кратных, код принятого ответа будет выглядеть примерно так: «Множитель? 1.5: (Multiplier2? 2: (Multiplier3? 3: 1)) 'и это без избыточного использования' Value'. С 'if' вы можете использовать' else if', поэтому вам не нужна какая-либо вложенность. – clcto

+0

arent вложенные ifs более тяжелые на производительность, хотя? – Firro

Смежные вопросы