Для возврата двойного я должен бросить, чтобы удвоиться, даже если типы являются двойными в c#?

Существует простой способ отображения некоторых данных через каждые 10 секунд.

@Override
protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_launcher);
  ActionStartsHere();
}

public void ActionStartsHere() {
  againStartGPSAndSendFile();
}

public void againStartGPSAndSendFile() {
   new CountDownTimer(11000,10000) {
        @Override
        public void onTick(long millisUntilFinished) {
           // Display Data by Every Ten Second  
        }

        @Override
        public void onFinish() {
            ActionStartsHere();
        }
    }.start();
}   
7
задан TStamper 19 May 2009 в 19:51
поделиться

9 ответов

Нет, не знаете. Однако ваше выражение почти наверняка не выполняет то, что вы хотите.

Выражения 1/12 и 3/12 будут выполняться с использованием целочисленной арифметики.

Вероятно, вы захотите:

double result = a - b + 1/12d + 3/12d;

] или

double result = a - b + 1/(double) 12 + 3/(double) 12;

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

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

double result = a - b + (1 / 12) + (3 / 12);

Сложение и вычитание - это нормально, потому что типы a и b заставляют их выполняться с использованием арифметики с плавающей запятой - но потому что деление " связывает более плотно " чем сложение и вычитание (то есть это похоже на использование скобок выше), учитываются только непосредственные операнды.

Имеет ли это смысл?

РЕДАКТИРОВАТЬ: Поскольку это так популярно, имеет смысл включить сюда комментарий devinb:

double result = a - b + 1.0/12.0 + 3.0/12.0;

] Что касается компилятора, то все то же самое - вам просто нужно решить, что для вас яснее:

(double) 1
1.0
1d
19
ответ дан 6 December 2019 в 06:37
поделиться

Нет, преобразование не требуется.

2
ответ дан 6 December 2019 в 06:37
поделиться

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

double result = a - b + 1.0/12 + 3.0/12;
2
ответ дан 6 December 2019 в 06:37
поделиться

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

double a = 32.34;
double b = 234.24;
double result1 = a - b + 1/12 + 3/12;
double result2 = a - b + (double)1/12 + (double)3/12;
Console.WriteLine(result1);  // Result: -201.9
Console.WriteLine(result2);  // Result: -201.566666666667

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

2
ответ дан 6 December 2019 в 06:37
поделиться

Хм - Я сделал это для решения проблемы целочисленного деления, выполнив что-то вроде:

double result = a - b + 1/12.0 + 3/12.0

Кроме этого, приведение типов не потребуется.

2
ответ дан 6 December 2019 в 06:37
поделиться

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

например,

double a = 8.49374;

//casting is needed because the datatypes are different.
// a_int will end up with the value is 8, because the precision is lost.
int a_int = (int) a; 

double b = (double) a_int; 

В этом примере 'b' будет иметь значение «8.00000 ...», потому что a_int не содержит НИКАКОЙ десятичной информации, поэтому b имеет в своем распоряжении только целочисленную информацию.

0
ответ дан 6 December 2019 в 06:37
поделиться

Нет, не знаешь. Однако ваше выражение почти наверняка не выполняет то, что вы хотите.

Выражения 1/12 и 3/12 будут выполняться с использованием целочисленной арифметики.

Вероятно, вы захотите:

double result = a - b + 1/12d + 3/12d;

] или

double result = a - b + 1/(double) 12 + 3/(double) 12;

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

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

double result = a - b + (1 / 12) + (3 / 12);

Сложение и вычитание - это нормально, потому что типы a и b заставляют их выполняться с использованием арифметики с плавающей запятой - но потому что деление " связывает более плотно "

0
ответ дан 6 December 2019 в 06:37
поделиться

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

Насколько я помню, порядок выглядит примерно так (от наибольшего к наименьшему):

  1. decimal
  2. double
  3. float
  4. long / int64
  5. int / int32
  6. short / int16
  7. byte

Конечно, это пропускает беззнаковые версии каждого из этих .

0
ответ дан 6 December 2019 в 06:37
поделиться

Как правило, преобразование не требуется, но в вашем примере 1/12 и 3/12 являются целочисленным делением, в результате чего 0 для каждое выражение. Вам нужно будет преобразовать один из числителя или знаменателя в double .

0
ответ дан 6 December 2019 в 06:37
поделиться
Другие вопросы по тегам:

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