Nano Hash - криптовалюты, майнинг, программирование

Java - точность десятичного формата теряется при возврате числа с плавающей запятой или десятичного числа

Я просмотрел несколько тем, связанных с форматированием чисел. По большей части работает, кроме значения 3.101. Float и Double использовались вместе с форматами ## и 00.

import java.text.DecimalFormat;

public class DecimalFormatTest {
public static void main(String[] args) 
{
    Float d1 = -3.1011f;
    Double ds = -3.1011;
    DecimalFormat df = new DecimalFormat("#.##");
    System.out.println (Double.valueOf(df.format(d1)));
    System.out.println (Double.valueOf(df.format(ds)));

    DecimalFormat df2 = new DecimalFormat("#.00");
    System.out.println (Double.valueOf(df2.format(d1)));
    System.out.println (Double.valueOf(df2.format(ds)));
 }
}

Результат:

-3.1
-3.1
-3.1
-3.1

Ожидаемый результат:

-3.10
-3.10
-3.10
-3.10

Как упоминалось выше, это работает для всех других чисел, которые я тестировал. По какой-то причине это вызывает проблему.

Любые идеи относительно того, что делает это число таким особенным и какой дополнительный шаг необходим для получения 2-й цифры?

Имейте в виду, ключ в том, что я хочу в конечном итоге вернуть Float или Double.

07.04.2017

  • Возможный дубликат Как мне округлить удвоить до двух знаков после запятой в Java? 07.04.2017
  • Мне не совсем понятен ваш вопрос. 07.04.2017
  • Удалите биты Double.valueOf, и он будет работать лучше. 07.04.2017
  • Вы правильно форматируете значение, но затем повторно анализируете его как двойное (что сбрасывает конечные нули). 07.04.2017
  • Я удалил Double.valueOf, и он работает с использованием формата #.00, но мне нужно вернуть Double, а не строку. 07.04.2017
  • Двойники не отслеживают конечные нули или информацию о точности. Если вы хотите отслеживать эти вещи, удвоения не являются правильным типом данных для использования. (Кроме того, Double — это тип-оболочка, который вам не следует использовать, если только вам по какой-то причине не нужен объект вместо примитива. Назовите его double, чтобы получить примитивный тип.) 08.04.2017

Ответы:


1

Попробуй это.

public static void main(String[] args) 
    {
        Float d1 = -3.1011f;
        Double ds = -3.1011;
        DecimalFormat df = new DecimalFormat("0.00");
        System.out.println (df.format(d1));
        System.out.println (df.format(ds));

        DecimalFormat df2 = new DecimalFormat("0.00");
        System.out.println (df2.format(d1));
        System.out.println (df2.format(ds));
     }
07.04.2017
  • Добро пожаловать в Stack Overflow! Хотя вы, возможно, решили проблему этого пользователя, ответы, содержащие только код, не очень полезны для пользователей, которые обратятся к этому вопросу в будущем. Пожалуйста, отредактируйте свой ответ, чтобы объяснить, почему ваш код решает исходную проблему. 07.04.2017

  • 2

    Это работает:

    Double number = 3.101;
    System.out.printf("%.2f", number);
    
    07.04.2017
  • Добро пожаловать в Stack Overflow! Хотя вы, возможно, решили проблему этого пользователя, ответы, содержащие только код, не очень полезны для пользователей, которые обратятся к этому вопросу в будущем. Пожалуйста, отредактируйте свой ответ, чтобы объяснить, почему ваш код решает исходную проблему. 07.04.2017

  • 3

    Главный виновник здесь Double.valueOf . Попробуйте удалить его, и он должен работать нормально, как показано ниже: Кроме того, установка ("#.##") вызовет дополнительные проблемы. Поэтому лучше используйте любой ("0.00") по крайней мере после точности.

    import java.text.DecimalFormat;
    
    public class DecimalFormatTest {
    public static void main(String[] args) 
        {
            Float d1 = -3.1011f;
            Double ds = -3.1011;
            DecimalFormat df = new DecimalFormat("0.00");
            System.out.println (df.format(d1));
            System.out.println (df.format(ds));
    
            DecimalFormat df2 = new DecimalFormat("0.00");
            System.out.println (df2.format(d1));
            System.out.println (df2.format(ds));
         }
    }
    

    Для справки: Двойное десятичное форматирование в Java

    07.04.2017
  • Спасибо, в этом сценарии это имеет смысл, но использование Double.valueOf было связано с тем, что мне действительно нужен Double вместо строки. 07.04.2017
  • Смотрите реферальную ссылку. 07.04.2017
  • @Unhandled - Однако вам не нужен двойной тип данных для целей отображения. Тип данных Double отбрасывает конечные нули, так как в них нет необходимости. Вам нужны только конечные нули для целей отображения. 08.04.2017
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..