2013-10-07 4 views
0

Что делает «(int)» на самом деле в следующем операторе возврата?Что возвращает этот метод?

public double calc(double amount){ 
    return (int)(amount * 100)/100; 
} 

Я ожидал, что этот метод будет возвращать то же значение, которое было передано в, так как я умножая на 100 и деления на 100. , , возвращая меня к первоначальному значению, но когда я тестировал в компиляторе ложный. Например:

carInformation myCar = new carInformation(""); 
    System.out.println(myCar.calc(34.86432456789)); 

я получаю:

34.0 

почему это так?

+0

It этажей значение. Проверьте примитивное сужение. –

+0

@SotiriosDelimanolis, что это значит? –

+0

Это * действительно * свернутый способ написать 'Math.floor (...)'. –

ответ

0

Поскольку он отлит до int, он усекает значение 34.86... до 34. Целые числа не сохраняют десятичные знаки, поэтому они просто отрубают что-либо справа от десятичной точки.

Но так как вы возвращаете double, ваш метод преобразует ваше значение и добавляет дополнительное десятичное число: 34.0.

1

После умножения, отлитый на int обрезает ничего, кроме десятичной точки, так 3486.432456789 становится 3486, который делится на 100, чтобы получить 34. Это перебор; не требуется умножения или деления, просто: (int) amount. Тогда возвращаемое значение равно double, поэтому оно возвращается обратно к double: 34.0.

0

Это называется Narrowing Primitive Conversion. Преобразование выполняется, как описано

На первом этапе, число с плавающей точкой преобразуется либо в долго, если Т имеет длину, или к Int, если Т байт, короткий, символ или INT, следующим образом:

в противном случае, если число с плавающей точкой не является бесконечность, значение с плавающей точкой округляется до целого значения V, округление в стороне нуля, используя IEEE 754 круглодонных в стороне ноля режим (§4.2.3). Тогда есть два случая:

Если T имеет длину, и это целое значение может быть представлено в виде длинной, то результатом первого шага является длительное значение В.

В противном случае, если это целое число, значение может быть представлено как Int, то результат первого шага это значение INT В.

Таким образом, значение

(amount * 100) 

, который имеет тип double, преобразуется в int из-за отливки. Затем он делится на 100. Потому что ваш метод объявлен как возвращающая double, что результат widened от int к double следующему правилу:

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

0
  • (int) отбрасывает числитель к междунар. Итак, у вас будет 3486.
  • /100 выполняет деление . У вас будет 34.

Чтобы достичь того, чего вы хотите, выполнять деление с плавающей точкой:

return (int)(amount * 100.0)/100.0; 
Смежные вопросы