Перетворити double на float в Java


79

Я стикаюся з проблемою, пов’язаною з переходом doubleна float. Насправді я зберігаю плаваючий тип, 23423424666767у базі даних, але коли ми отримуємо дані з бази даних у наведеному нижче коді getInfoValueNumeric(), це doubleтип. Ми отримуємо цінність у 2.3423424666767E13формі.

То як ми можемо отримати floatтакі дані формату 23423424666767?

2.3423424666767E13 to 23423424666767

public void setInfoValueNumeric(java.lang.Double value) {
    setValue(4, value);
}


@javax.persistence.Column(name = "InfoValueNumeric", precision = 53)
public java.lang.Double getInfoValueNumeric() {
    return (java.lang.Double) getValue(4);
}

3
просто киньте. подвійний d = 3,0; float f = (float) d;
Том Веллброк,

Цифри виглядають однаково, просто різні подання одного і того ж значення.
mksteve

Це не працює для мене
Сітансу,

якщо це форматування, яке ви хочете отримати, використовуйте бібліотеку NumberFormat. Якщо ви хочете скоротити свій номер. Подібно: 10000-> 100, ви можете використовувати math.round ()
Том Веллброк,

floatне має достатньої точності для таких чисел, як 23423424666767. Він може бути точним лише до ~ 7 десяткових цифр
phuclv

Відповіді:


192

Просто киньте свій дубль на поплавок.

double d = getInfoValueNumeric();
float f = (float)d;

Також зауважте, що примітивні типи НЕ можуть зберігати нескінченний набір чисел:

float range: from 1.40129846432481707e-45 to 3.40282346638528860e+38
double range: from 1.7e–308 to 1.7e+308

5
@JimmyKane переконайтесь, що ви використовуєте примітивні типи "float" та "double", а не типи об'єктів "Float", "Double".
Tom Wellbrock,

1
Ей, Томе, це дорога операція. Чи можете ви пояснити, що робить Java під капотом?
Сем Ороско

@SamOrozco ось, в основному, трапляються дві речі: 1. подвійне значення автоматично додається до типу об’єкта. В основному це новий екземпляр Double, який містить примітивне значення double. 2. Оскільки objectTypes Double і Float обидва похідні від Number, вони можуть бути перетворені один в одного.
Том Веллброк,

Тепер повернемося до вашого запитання, оскільки ми звужуємо наш тип від Double до Float замість того, щоб розширювати, наприклад. Подвоїти на об'єкт. Java повинна перевірити наявність потенційних винятків ClassCastExceptions під час виконання. Але я не можу точно сказати, скільки накладних витрат виробляє. Що стосується самого обчислення, то це не що інше, як створення екземплярів об'єкта (автобокс) та отримання примітивного значення (автоунбокс). Я знаю, що моя відповідь невизначена, але, сподіваюся, вона все одно допоможе. Якщо ви дійсно зацікавлені, перегляньте теми, пов’язані з авто- (не) боксом тут, на Stackoverflow.
Том Веллброк,

26

Я пропоную вам отримати значення, яке зберігається в Базі даних як тип BigDecimal:

BigDecimal number = new BigDecimal("2.3423424666767E13");

int myInt = number.intValue();
double myDouble = number.doubleValue();

// your purpose
float myFloat = number.floatValue();

BigDecimal надає вам багато функціональних можливостей.


4
Якщо хтось передає значення, яке не є рядком, рекомендується використовувати BigDecimal.valueOf () замість new BigDecimal () . Дивіться https://dev.eclipse.org/sonar/rules/show/squid:S2111
Річка

Це старе посилання мертве. Ось ще одне: sonar.spring.io/coding_rules#rule_key=squid%3AS2111
Річка

17

Перетворити DoubleнаFloat

public static Float convertToFloat(Double doubleValue) {
    return doubleValue == null ? null : doubleValue.floatValue();
}

Перетворити doubleнаFloat

public static Float convertToFloat(double doubleValue) {
    return (float) doubleValue;
}

9

Це хороший спосіб зробити це:

Double d = 0.5;
float f = d.floatValue();

якщо у вас d як примітивний тип, просто додайте один рядок:

double d = 0.5;
Double D = Double.valueOf(d);
float f = D.floatValue();

Дуже елегантний. Я відчуваю себе безпечніше, використовуючи цей метод, ніж просто кастинг - навіть якщо це помилкова безпека.
manuelvigarcia

3

Щоб відповісти на ваш запит на тему "Як перетворити 2.3423424666767E13 на 23423424666767"

Для форматування десяткових чисел можна використовувати десятковий форматор .

     double d = 2.3423424666767E13;
     DecimalFormat decimalFormat = new DecimalFormat("#");
     System.out.println(decimalFormat.format(d));

Вихід: 23423424666767


3
Це не перетворює подвійне значення у formatметод float ... повертає об'єкт String.
antoniodvr

добре після цього
Струну

2
Ви завжди можете перетворити значення рядка в плаваюче за допомогою 'Float.parseFloat (decimalFormat.format (d))'. Хоча це все ще представляє значення з науковим представленням як 2.34234241E13 .
Priyambada Madala

3

Перетворення з подвійного на плаваючий буде перетворенням, що звужується. З документа :

Примітивне перетворення, що звужує, може втратити інформацію про загальну величину числового значення, а також може втратити точність і діапазон.

Примітивне перетворення звуження з подвійного на плаваюче регулюється правилами округлення IEEE 754 (§4.2.4). Це перетворення може втратити точність, але також втратити діапазон, в результаті чого плаваючий нуль від ненульового подвійного і нескінченний поплавок від кінцевого подвійного. Подвійний NaN перетворюється на плаваючий NaN, а подвійна нескінченність перетворюється на нескінченність з плаваючим знаком з тим самим підписом.

Тож це не гарна ідея. Якщо ви все ще хочете, ви можете зробити це, як:

double d = 3.0;
float f = (float) d;

0

Проблема полягає в тому, що ваше значення не може бути точно збережене в одинарній точності з плаваючою комою. Доказ:

public class test{
    public static void main(String[] args){
        Float a = Float.valueOf("23423424666767");
        System.out.printf("%f\n", a); //23423424135168,000000
        System.out.println(a);        //2.34234241E13
    }
}

Інша справа: ви не отримуєте "2.3423424666767E13", це лише візуальне представлення числа, що зберігається в пам'яті. "Як ви друкуєте" і "що є в пам'яті" - це дві різні речі. Наведений вище приклад показує, як надрукувати номер як плаваючий, що уникає наукових позначень, які ви отримували.


0

Перш за все, той факт, що значення бази даних є плаваючим, не означає, що воно також вміщується в Java float. Float - це скорочення з плаваючою точкою , і існують типи з плаваючою комою з різними точностями Типи Java floatі doubleобидва типи з плаваючою комою різної точності. У базі даних викликаються обидва FLOAT. Оскільки він doubleмає більш високу точність, ніж float, ймовірно, є кращою ідеєю не передавати своє значення afloat , оскільки ви можете втратити точність.

Ви також можете використовувати BigDecimal, які представляють число довільної точності.


0

Використовуйте лиття dataType. Наприклад:

// converting from double to float:
double someValue;
// cast someValue to float!
float newValue = (float)someValue;

На здоров’я!

Примітка:

Цілі числа - цілі числа, наприклад 10, 400 або -5.

Числа з плаваючою комою (плаваючі) мають десяткові коми і десяткові коми, наприклад 12,5 та 56,7786543.

Подвійні - це специфічний тип числа з плаваючою точкою, що має більшу точність, ніж стандартні числа з плаваючою комою (це означає, що вони точні до більшої кількості знаків після коми).


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.