Использование двойных до двух десятичных знаков - PullRequest
1 голос
/ 02 июля 2011

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

РЕДАКТИРОВАТЬ Мои значения не велики.скажем от 0 до 5000 максимум.Но мне приходится много раз умножать на Cos A, Sin A, где значение A постоянно меняется в течение программы.

EDIT Посмотрите в моей программе, что автомобильдвигаясь с определенной скоростью, скажем, 12 м / с.Теперь через каждые несколько минут автомобиль меняет направление, как будто выбирает новый угол и начинает двигаться по прямой в этом направлении.Теперь каждый раз, когда он движется, я должен выяснить его координаты x и y на карте.это будет currentX + скорость * Cos A и currentY + Velocity * Sin A. но так как это происходит часто, со временем будет много накопленной ошибки.Как этого избежать?

Ответы [ 5 ]

12 голосов
/ 02 июля 2011

При сравнении значений с плавающей точкой на равенство всегда следует использовать некоторую форму сравнения дельта / эпсилон:

if (Abs(value1 - value2) < 0.01 )
{
   // considered equal to 2 decimal places
}
2 голосов
/ 02 июля 2011

Не используйте float (или double).Во-первых, он не может представлять все двузначные числа.С другой стороны, вы можете получить тот же (но точный) эффект с int или long.Просто представьте, что столбец десятков и единиц - это столбец десятых и сотых.Вы всегда можете разделить на 100,0, если вам нужно вывести результат на экран, но для сравнения и закулисной работы целочисленное хранилище должно подойти.Вы даже можете получить произвольную точность с BigInteger.

1 голос
/ 02 июля 2011

Для округления до двух десятичных разрядов вы можете использовать округление

public static double round2(double d) {
     return Math.round(d * 100) / 100.0;
}

Это округляет только половину.

Примечание: десятичные значения в двойном представлении могут не быть точным представлением.Когда вы используете Double.toString (double) прямо или косвенно, он выполняет небольшое количество округлений, поэтому число будет отображаться так, как задумано.Однако, если вы возьмете это число и выполните операцию, вам может понадобиться снова округлить число.

1 голос
/ 02 июля 2011

Чтобы сохранить значение в 2 десятичных знака, используйте класс BigDecimal следующим образом:

private static final int DECIMAL_PLACES = 2;

public static void main(String... args) {
    System.out.println(twoDecimalPlaces(12.222222)); // Prints 12.22
    System.out.println(twoDecimalPlaces(12.599999)); // Prints 12.60
}

private static java.math.BigDecimal twoDecimalPlaces(final double d) {
    return new java.math.BigDecimal(d).setScale(DECIMAL_PLACES, 
        java.math.RoundingMode.HALF_UP);
}
0 голосов
/ 02 июля 2011

будет храниться до 2 десятичных знаков

Невозможно.Числа с плавающей запятой не имеют десятичных знаков.У них есть двоичные места после точки.

У вас есть два варианта:

(a) не использовать число с плавающей запятой, согласно ответу dlev, и специально использовать BigDecimal;

(b) установить требуемую точность при выполнении вывода , например, через DecimalFormat, столбец SQL с определенной десятичной точностью и т. Д.

Вы также должны хорошо взглянуть на Что должен знать каждый программист о плавающей точке .

...