#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
эквивалента. Afloat
имеет только 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)? Они довольно точны и полезны для большинства приложений с плавающей запятой, но не для приложений, которые предъявляют строгие требования к точности, такие как финансовые вычисления.