2012-06-16 3 views
1

Я хочу разделить число типа double, на int. Мне нужен результат только в 2 дефимных местах в строчном формате. Каков наилучший способ сделать это с точки зрения эффективности стека?деление эффективно

double d=321321321313131233213213213213; 
int i=123; 

ToString(d/i); //what do I get when I do this? A double? A float? 

     public String ToString(float? result) //what should I cast the result? 
     { 
      return @String.Format("{0:#,0.##;} divided double by int", result); 
     } 
+1

и '@ ~ перед именем функции ничего не делает в C#. Он должен выбросить ошибку компилятора. –

+0

Пожалуйста, оставьте «C#» перед вашими заголовками. См. «[Переполнение стека не нуждается в ваших навыках SEO] (http://meta.stackexchange.com/a/130208)». –

+1

@Cole, это неверно. Здесь не нужно *. Но это законно. (чтобы быть понятным, '@' позволяет использовать - как * идентификаторы * - то, что в противном случае было бы зарезервированным словом. Имена методов - это идентификаторы) –

ответ

5

ToString (d/я); // Что я получу, когда я это сделаю? Двойной? Поплавок?

Вы получите двойной. Разделение двойной на int приведет к двойному значению.

public String ToString (float? Result) // что я должен делать результат?

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

Каков наилучший способ сделать это с точки зрения эффективности стека?

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


Чистый способ справиться с этим было бы просто использовать double.ToString("N2"), то есть:

double result = d/i; 
string resultAsString = result.ToString("N2"); 

Если вы хотите полностью отформатированную строку, вы можете использовать:

string resultAsString = string.Format("{0:N2} divided double by int", result); 
2

Ok. Прежде всего, вы получаете double, неdouble? или float?. Математические функции должны никогда возвращать тип с нулевым значением. Если вы считаете, что бесконечность представлена ​​как null, вы ошибаетесь. Бесконечность определяется битами. Вы можете видеть, является ли double бесконечным с Double.IsInfinity(double).

[SecuritySafeCritical] 
public static unsafe bool IsInfinity(double d) 
{ 
    return ((*(((long*) &d)) & 0x7fffffffffffffffL) == 0x7ff0000000000000L); 
} 

Что такое лучший способ сделать это с точки зрения эффективности стека?

Я бы порекомендовал посмотреть на tragedies of micro optimization в Coding Horror.


Что касается функции. Это совершенно не нужно. Лучше всего Double.ToString(...):

double val = d/i; 
string result = val.ToString("N2"); 

Однако, если вы используете String.Format(...), вы можете использовать:

double val = d/i; 
string result = string.Format("{0:N2} divided double by int", val); 
+0

Just FYI - Бросок не требуется - Int32 автоматически расширится до Double в этом случае. –

+0

@ ReedCopsey hmm. Когда я делал 'float * int', я получил 0 в своем приложении, пока не произнесет. –

+0

Cole: Спецификация языка C#, "7.3.6.2 Двоичные числовые рекламные акции" обрабатывает это "- если один из операндов имеет тип double, другой операнд преобразуется в тип double." (сначала десятичное, затем двойное, затем float) –

-1

Hacky Решение:

Если вам нужно всего 2 десятичных знака, вы можете умножить свой двойной на 100, преобразовать его в целое число, а затем разделите его на i.

Теперь возьмите строку результата и добавьте точку перед двумя последними символами.

Не забудьте обработать краевые случаи отрицательных значений и проблемы округления.

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

+0

как насчет бит сдвигов? – River

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