Безумие с плавающей точкой в ​​Java с неявными преобразованиями? - PullRequest
0 голосов
/ 27 сентября 2019

Почему, предполагая, что A является массивом целых чисел, а D является двойным и K целым числом,

int v = ((A[i+1]-A[i])/D);
K -= v;

приводит к ошибке компиляции в Java, но

double v = ((A[i+1]-A[i])/D);
K -= v;

не так?

Даже страннее,

A

K -= ((A[i+1]-A[i])/D);

дает результат, отличный от

B

K -= (int)((A[i+1]-A[i])/D);

Это не имеет никакого смысла для меня?Я всегда предполагал, что А) никогда не скомпилируется (пытаясь неявно преобразовать двойное число в целое).

Может ли кто-нибудь объяснить мне этот вопрос?

Спасибо

1 Ответ

4 голосов
/ 27 сентября 2019

Второй случай включает преобразование (int) из-за определения составных операторов, таких как - =.См. Спецификацию языка Java, 15.26.2.Составные операторы присваивания :

Составное выражение присваивания в форме E1 op = E2 эквивалентно E1 = (T) ((E1) op (E2)), где T - типE1, за исключением того, что E1 оценивается только один раз.

K -= v; эквивалентно K = (int)((K) - (v)), за исключением того, что K оценивается только один раз.

(A) делаетвычитание в двойной арифметике.(B) выполняет вычитание в int арифметике, после преобразования в int результат вычисления ((A[i+1]-A[i])/D).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...