Вопрос по java, android – Android - точный математический расчет

0

У меня есть проблема, я разрабатываю приложение, которое должно быть в состоянии сделать некоторые математические вычисления. Эти расчеты должны быть точными (точнее, не явно ошибочными)

Но этот простой код

<code>double a = 3.048d;
double b = 1000d;

double c = a / b;
</code>

дает мне неправильный результат с не 0,003048, как ожидалось, вместо этого 0,0030480000000000004, что, очевидно, неправильно.

<code>double d = 3.048 / 1000; 
</code>

этот второй фрагмент кода дает правильный результат.

Мне известно, что вся арифметика с плавающей точкой не является точной при расчете с помощью компьютеров, но я не знаю, как решить эту проблему.

заранее спасибо!
Людвиг

Разработка для:
- Android 2.2
Testdevice:
- HTC Desire

Ваш Ответ

4   ответа
4

Что нужно использовать для точного разрешения - это BigDecimal объект:

BigDecimal a = new BigDecimal("3.048");
BigDecimal b = new BigDecimal(1000);

BigDecimal c = a.divide(b);

System.out.println(c); //0.003048
hey johncarl, большое спасибо за непредсказуемый намек со String на создание нового BigDecimal. Думаю, это могло быть проблемой, с которой я сталкивался в прежние времена при использовании BigDecimal. DrLudwig3
Я не знаю, на какую проблему вы ссылались ранее, но вы также можете представить 3.048 как: BigDecimal a = new BigDecimal (3048) .divide (new BigDecimal (1000)) John Ericksen
1

IEEE 754 представление с плавающей точкой, не ошибка. Чтобы справиться с этим, округлите результат с соответствующей точностью.

1

Использовать BigDecimal для точных вычислений с плавающей точкой. Установка масштаба позволяет вам точно указать, как далеко вы хотите выйти на выход.

import java.math.BigDecimal;

class Test{

        public static void main(String[] args){
                BigDecimal a = new BigDecimal("3.048");
                BigDecimal b = new BigDecimal(1000);
                BigDecimal c = a.divide(b).setScale(6);
                System.out.println(c); //0.003048
        }
}
0

Точный ассигнования.

Кстати, результат для d, очевидно, правильный, потому что double имеет машинную кодировку, которая не может сохранить результат, который вы считаете правильным.

Похожие вопросы