Ява плавать неожиданно округлено - PullRequest
0 голосов
/ 17 февраля 2012

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

private final float RF_FREQUENCY = 956.35625f;
Object o = new Object();
o.setRFFrequency(RF_FREQUENCY);
System.out.println(o.getRFFrequency);

Вывод: 956.35626

Переменная в объекте объявлена ​​как protected float rfFrequency;, а ниже указаны методы получения и установки.

public float getRFFrequency() {
        return rfFrequency;
    }
public void setRFFrequency(float value) {
        this.rfFrequency = value;
    }

Есть идеи, почему это происходит?

Ответы [ 3 ]

3 голосов
/ 17 февраля 2012

Поскольку числа с плавающей точкой одинарной точности IEEE754 имеют только 23 бита точности (24 включая неявный 1 бит в начале).

Это соответствует примерно семи десятичным цифрам, и вы можете видеть, что ваш число состоит из восьми цифр.

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

Если вам нужна большая точность,использовать двойной.Это дает вам 52/53 битов, что соответствует примерно 15 десятичным цифрам.

2 голосов
/ 17 февраля 2012

Число с плавающей точкой не может представлять каждое число, поэтому числа округляются. Парные одинаковые, но с большей точностью. Если вы используете Double, ваш вывод будет 956.35625 (в этом особом случае).

1 голос
/ 17 февраля 2012

После некоторого тестирования я получил такой результат:

final float RF_FREQUENCY = 956.35625f;
System.out.println(String.format("%.5f", RF_FREQUENCY));
final BigDecimal xRF_FREQUENCY = new BigDecimal(956.35625);
System.out.println(String.format("%.5f", xRF_FREQUENCY));

И вывод был:

956,35626
956,35625

Итак, как объяснено более подробно из coderanch и в этом сообщении в блоге , я рекомендую вам изменить на BigDecimal.

РЕДАКТИРОВАТЬ: я нашел другой пост о той же проблеме в stackoverflow Double против BigDecimal? Надеюсь, это поможет вам.

...