Метод Float.doubleValue () - PullRequest
       19

Метод Float.doubleValue ()

1 голос
/ 18 ноября 2011

Я ищу лучшую практику для преобразования Float в Double без потери точности.Пока что я обнаружил, что правильный способ сделать это - преобразовать Float в String, а String в Double.

Поиск Float API Я наткнулся на этот метод doubleValue ().Я думал, что это статический конструктор, который будет возвращать double из моего Float без потери точности, но следующий код ведет себя как приведение:

public class Main {
  public static void main(String[] args) {

  Float floatNumber= 4.95f;
  Double doubleNumber= floatNumber.doubleValue();

  System.out.println(doubleNumber);

  }
}

Вывод 4.949999809265137

Поиск любой другой документацииоб этом из Float API я не нашел никакой документации, чтобы сказать мне, что именно происходит, когда я вызываю этот метод.У кого-нибудь есть идеи?Или кто-то может подтвердить, что все, что делает этот метод - это выполнить приведение моего Float к двойному и распаковать его?

Ответы [ 3 ]

7 голосов
/ 18 ноября 2011

Простое приведение примитивного типа (или даже неявное преобразование) сделает все, что вам нужно, если вы действительно хотите сохранить значение с плавающей запятой:

float f = 4.95f;
double d = f;

По сути, 4.95f - это уже неточно - вы не можете представить это число в точности как число с плавающей точкой. Точное значение floatNumber также представлено в doubleNumber - просто это значение равно , а не 4.95.

Если вам действительно нужны точные десятичные цифры, вам следует использовать BigDecimal вместо (или масштабированное целое число).

2 голосов
/ 18 ноября 2011

Расширение числа с плавающей точкой до двойного преобразования не теряет точности в Java.

0 голосов
/ 18 ноября 2011

Когда вы используете плавающую точку, вы получаете ошибки округления, которые потенциально могут быть «исправлены» путем округления результата (при условии, что вы знаете, какую точность вы хотите). BigDecimal обрабатывает это, всегда зная точность.

float floatNumber= 4.95f;
double doubleNumber = (double) floatNumber;
System.out.println("After cast " + doubleNumber);
System.out.printf("Show two decimal places. %.2f%n", doubleNumber);
doubleNumber = Math.round(doubleNumber * 100) / 100.0;
System.out.println("After rounding to two places " + doubleNumber);

печать

After cast 4.949999809265137
Show two decimal places. 4.95
After rounding to two places 4.95
...