ошибка умножения

#java #android

#java #Android

Вопрос:

Если я умножу 12 на 25,4, я получу 304,7, тогда как я ожидаю 304,8. Я вижу, что при использовании нечетных чисел x 25,4 я получаю правильные ответы, но при использовании четных чисел всегда кажется, что они отклоняются на 0,1. Я пишу научное приложение, которое в значительной степени основано на формулах, поэтому любая информация была бы полезна.

 if (((m1_sqs1_spinner.getSelectedItem().toString().equals("in"))))  

    { // start square in inches
         double m1_sqs1_eng = new Double(m1_sqs1.getText().toString()); 

         double square_effective_dia_inch = m1_sqs1_eng;

         double square_effective_dia_mm = square_effective_dia_inch * 25.4;
         m1_ed_mm.setText(Double.toString(square_effective_dia_mm));

    } // end square in inches
  

Комментарии:

1. Добро пожаловать в мир математики с плавающей запятой. Вы не говорите, как вы определяете типы, но если вы занимаетесь научной работой, я бы посмотрел на существующие библиотеки, такие как jscience. (Не заметил часть Android, не знаю, работает ли она на Android.)

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

3. Вау, на 8 вопросов даны ответы, и ни один не принят. Впечатляет!

4. О! Я не видел этого, когда добавлял свой ответ.

5. @WmBurkert: Чтобы принять ответы на ваши предыдущие вопросы, вам нужно вернуться к своим вопросам и выбрать лучший, нажав на галочку рядом с одним ответом, который был лучшим.

Ответ №1:

Типы чисел с плавающей запятой в Java являются приближениями. Попробуйте добавить 1 2 3 4 как float введите, и в итоге может получиться 10.00000003.

Для обеспечения точной математики попробуйте использовать java.math.BigDecimal тип . Это проблема с памятью, но она точная.

Комментарии:

1. это плохой пример. Каждое из этих целых чисел имеет точные представления в виде float значений, как и их сумма. Однако ваша общая точка зрения верна.

2. @StephenC Признаюсь, мои знания по основной проблеме ограничены, но недавно я попытался использовать значение с плавающей точкой в качестве счетчика, увеличивающегося на целые числа каждый раз в цикле. Конечный результат был десятичным, как указано выше. Это сценарий разницы?

3. Разница в том, что случай, когда у вас возникла эта проблема, вероятно, попал в диапазон int значений, которые не имеют точного float эквивалента. A float имеет только 23 бита точности в значимом, поэтому (например) нечетные числа, большие 2 ^ 23, не могут быть представлены точно. (2 ^ 23 — это примерно 8 миллионов.) В отличие от этого, 1 , 2 3 , 4 10 все может быть представлено точно.

Ответ №2:

Я не знаю, какой язык программирования вы используете, но 12 * 25.4 дает мне 304.8, когда я делаю это с помощью Java:

 public static void main(String[] args) {
   double result = 12 * 25.4;

   System.out.printf("Result: %.1f%n", result );
}
  

А если серьезно — как вы отображаете полученный результат? Используете ли вы один из многих вариантов числового форматирования, доступных в Java (один из которых показан выше)? Также вы понимаете пределы точности при использовании 64-разрядных переменных IEEE 754 с плавающей запятой (double)? Они довольно точны и полезны для большинства приложений с плавающей запятой, но не для приложений, которые предъявляют строгие требования к точности, такие как финансовые вычисления.