Округление и Double.valueOf с плавающей запятой

В Java 6 есть только два метода Double#valueOf: Double#valueOf(double) и Double#valueOf(String).

1 - Метод Witch вызывается, когда я выполняю Double#valueOf(float)?

Согласно Javadoc, это похоже на Double#valueOf(String), но Eclipse связывается с Double#valueOf(double).

2-Почему такие разные?

Вызов Double.valueOf с плавающей запятой вокруг результата:

System.out.println(Double.valueOf(0.63F));  // displays 0.6299999952316284

Тогда как

System.out.println(Double.valueOf(String.valueOf(0.63F)));  // displays 0.63

Извлечение из javadoc (http://docs.oracle.com/javase/6/docs/api/java/lang/Double.html#valueOf(java.lang.String)):

the float literal 0.1f is equal to the double value 0.10000000149011612

и

строка в параметре is regarded as representing an exact decimal value in the usual "computerized scientific notation" or as an exact hexadecimal value; this exact numerical value is then conceptually converted to an "infinitely precise" binary value that is then rounded to type double by the usual round-to-nearest rule of IEEE 754 floating-point arithmetic


person Jean-Charles    schedule 12.06.2013    source источник
comment
Согласно Javadoc, это похоже на Double#valueOf(String) ‹ -- где вы это прочитали? Я совсем не так читаю javadoc...   -  person fge    schedule 12.06.2013
comment
Я не читал его явно, но javadoc Double#valueOf(double) предоставляет не так много информации и не говорит о представлении float...   -  person Jean-Charles    schedule 13.06.2013


Ответы (1)


Согласно Javadoc, это похоже на Double#valueOf(String), но Eclipse связывается с Double#valueOf(double).

Я не смог найти место в Javadoc, где бы предполагалось, что в этой ситуации будет вызвана перегрузка String, но Eclipse прав: неявного преобразования из float в String нет, но есть неявное преобразование из float в double, поэтому Double#valueOf(double) является правильной перегрузкой.

Вызов Double.valueOf с плавающей запятой вокруг результата

Он не «округляет» результат, а изменяет его представление, чтобы оно соответствовало double, что имеет более высокую точность. Однако ни float, ни double не могут точно представлять 0.1, потому что его нельзя представить в виде суммы отрицательных степеней 2. Если вы используете 0.25 вместо 0.1, этого не произойдет, потому что 0.25 равно 2 ^ -2 и, следовательно, может быть точно представлено как в float, так и в double.

person Sergey Kalinichenko    schedule 12.06.2013
comment
Я подозревал, что существует понятие репрезентации. Спасибо за это подробное объяснение - person Jean-Charles; 13.06.2013