2014-02-12 2 views
-1

Я пытаюсь разделить длинный (someValue) на int. Это должно вернуть десятичное значение. Я попытался,long division in Java

double result = (double)(someValue/3600); 

double result = (double)((double)someValue/(double)3600); 

, но безрезультатно. В результате я получаю целое число. Пожалуйста, помогите.

+1

Что вы будете делать? Каковы ваши фактические результаты? Приведите примеры. –

+0

'(double) someValue/3600' или' someValue/3600.0' достаточно, чтобы «продвигать все», чтобы удвоить/удвоить, если 'someValue' еще не является двойным. Во всяком случае, что «не работает», «безрезультатно»? – user2864740

+0

«Точное значение» может быть невозможно в двоичном или десятичном формате. Что бы вы ожидали, если, скажем, длинные были 10, а int - 3? –

ответ

4
  1. Это не будет работать, потому что вы вычисления результата, а затем сделать бросок.

    double result = (double)(someValue/3600); 
    
  2. Но почему это не работало? Для меня это работает отлично, потому что вы должны удвоить значения до вычисления.

    double result = (double)((double)someValue/(double)3600); 
    

Но нет никакой необходимости снова заливки результата! Или для того, чтобы оба значения удваивались. И его достаточно, если вы добавляете d в конце номера, чтобы сообщить компилятору, что это число должно быть значение dobule:

double result = someValue/3600d; 
+0

Первый ответ, который * подтверждает * код OPs «должен работать» - +1. – user2864740

+0

@ user2864740 http://meta.stackexchange.com/questions/167832/is-works-fine-here-an-answer –

+2

@SotiriosDelimanolis Позвольте мне сказать по-другому: в отличие от других ответов, этот ответ подтверждает, что код OPs * уже есть * double/double во втором случае. Другие ответы * неверно * утверждают, что дополнительные скобки необходимы или каким-то образом влияют на поведение. – user2864740

0

Вы должны иметь хотя бы один из них как double. Вместо этого вы определяете результат деления как double. Этот кусок кода будет делать это:

double result = ((double)someValue)/((double)3600); 

Только в случае, если некоторые люди не доверяют о коде выше, обратитесь к this example.


Другим решением будет использовать вместо 3600.0:

double result = someValue/3600.0; 
+1

Почему downvote? Если это работает ... –

+0

OP уже показывает «эквивалент» во втором случае, но претензий «нет». – user2864740

+0

@ user2864740 Это не то же самое, поскольку OP отличает результат всего деления, в то время как мой пример отличает ** каждую ** переменную. –

1
double result = (double)(someValue/3600); 

Это не будет работать, потому что someValue/3600 будет вычисляться первым, и это будет сделано с int расчетов.

Вы должны явно литая одна сторона (другой будет наложено неявно):

double result = (double)someValue/3600; 
+0

Почему не будет работать второй случай? – user2864740

+0

Если 'someValue' является' long', тогда результат будет 'long' отдан в' double'. –

+0

OP уже показывает «эквивалент» во втором случае, но претензий «нет». – user2864740

2

Если вам нужны точные вычисления с плавающей точкой, рекомендуемый способ сделать это состоит в использование BigDecimal. Это действительно независимый от платформы способ (любой другой получит результаты, зависящие от архитектуры).

http://docs.oracle.com/javase/7/docs/api/java/math/BigDecimal.html

Это довольно хороший учебник по BigDecimals и их использование

http://www.opentaps.org/docs/index.php/How_to_Use_Java_BigDecimal:_A_Tutorial

0

Вещи, чтобы быть в курсе, когда делать с плавающей точкой arithematic:

Вы FRIST путь, someValue/3600 собирается сначала вычисляется, и это целочисленное деление, и оно даст вам целое число, а затем добавляется к двойному, что не дает вам правильный ответ.

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

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