Как то, чтобы переходить с Double из String, не теряя точности в десятичных - Java

Я хочу переместить десятичное число, что находится в переменной типа String в один из типа Double, но раньше применяя конкретный формат с DecimalFormat (import java. Text. DecimalFormat) для того, чтобы у него было всегда 3 десятичные. Реализовав превращение всегда он теряет меня десятичные, более точно десятичные, которых 0 в правую сторону.

Вы знаете, как реализовывать это превращение, не теряя этой точности?

Я нашел, что используя тип BigDecimal решается, но мне хотелось бы реализовывать это превращение, не используя этого.

Привет,


Например:

Double d = 0.85;   // 0.85
DecimalFormat mf = new DecimalFormat("#0.000");
String s = mf.format(d); // "0,850"

s = s.replace(',', '.'); // "0.850"

double conv = Double.parseDouble(s); //0.85

//Como pasar del String s = "0.850" -> Double = 0.850?
0
задан 31.03.2016, 09:26
2 ответа

Превращение, которое ты реализуешь, - правильно:

double conv = Double.parseDouble(s); //0.85

Я не вижу необходимость добавлять десятичных, которые являются нулем после десятичной точки в стоимости двойного типа.

Если ты имеешь десятичные в 0 после десятичной точки, он как будто они не существовали следовательно:

 if(0.850 == 0.85){
            System.out.println("Esto es lo mismo!");
   }

Если мы определяем переменную с десятичными в правую сторону, которая это нули, после десятичной точки:

double va = 0.8500000000000;

стоимость будет всегда 0.85

Если мы определяем переменную с десятичными в правую сторону, и существует число, которое не нуль, после десятичной точки:

double va = 0.8500000000001;

тогда стоимость была бы 0.8500000000001

Если ты только хочешь напечатать на экране стоимость и уверить в том, что иметь все десятичных ты можешь использовать setMinimumFractionDigits ()

  Double d = 0.85;   // 0.85
        DecimalFormat mf = new DecimalFormat("0.000");
        mf.setMinimumFractionDigits(3);
        String s = mf.format(d);

Здесь у тебя будет стоимость: 0.850

2
ответ дан 24.11.2019, 14:40
  • 1
    спасибо за твой комментарий! Но проблема состоит в том, что это не, чтобы считать ning и # 250; n стоимость, так как схвати, и # 237; эти 0 не необходимы, но это, чтобы печатать из-за экрана этот 0.85 в этом формате 0.850. Чтобы форматировать я использую DecimalFormat, но когда у меня есть String s = " 0.850" произойдя с Double, он удаляет мне 0 конец и не, как реализация этого conversi и # 243; n поддерживая этот и #250; ltimo десятичный. – jmgc1982 31.03.2016, 10:23
  • 2
    @jmgc1982, Если ты нуждаешься в том, чтобы напечатать это, ты можешь делать это в формате string, не обращая этого в двойную порцию, и так, что 3 цифры заверяют в том, что не показывают минимум, раздели их на мелкие части, с setMinimumFractionDigits (3); увидь мой actualizaci и # 243; n. – Jorgesys♦ 31.03.2016, 10:30
  • 3
    Очень интересный м и # 233; каждый setMinimumFractionDigits (), это не знал, но дело в том, что в конце концов это должен быть Double, так как эта стоимость возвращает м и # 233; все, кто содержит c и # 243; я говорю и этот м и # 233; все возвращает Double. – jmgc1982 31.03.2016, 10:57
  • 4
    уже я это решил! В этом классе hab и # 237; в один м и # 233; совсем созданный, что проходил с String и экспертом и # 237; pod и # 237; чтобы реализовывать форматирование. – jmgc1982 31.03.2016, 12:01
  • 5
    Большое спасибо из-за помощи @Elenasys!!! – jmgc1982 31.03.2016, 12:02

Вы знаете, как реализовывать это превращение, не теряя этой точности?

В действительности, не существует никакой такой метод, потому что есть большая проблема:

  • Тип double он кодируется в бинарном.

Например, используя калькулятор этого сайта, десятичное числительное 0.850 соответствует этому бинарному числительному:

0.11011001100110011001100110011001100110011001100110011001100110...

Приостанавливающие точки показывают, что это числительное повторяется (равный в как 1/3 = 0.33333...). Когда мы снимаем приостанавливающие точки и помещаем бинарное числительное на этой странице для превращения обратно в десятичный, мы получаем:

0.8499999999999999999132638262011596452794037759304046630859375

У 0.850 есть три цифры в десятичном, но бесконечно многие в бинарном. Что означает, что, когда мы пишем double x = 0.850 стоимость x его нет в действительности 0.850, а число, близкое к 0.850, которого мы не можем говорить, оригинально был ли написан 0.8500 как 0.85, 0.850 or.

Если неотъемлемые приближения в типе double so неприемлемые для какого-то приложения, где надо представлять десятичные числительные точным образом, нужно использовать BigDecimal.

1
ответ дан 24.11.2019, 14:40