2015-12-21 2 views
-2

Я очень новичок в программировании на Java. Мне было дано задание в моей школе, чтобы решить следующее упражнение:Как использовать «BigDecimal» в Java для моего кода?

«Создайте две переменные, каждая из которых содержит число. Положите сообщение, показывающее, как часто второй номер вписывается в первый, а остальные (если таковой имеется ») [Я надеюсь, что формулировка понятна. Я перевожу это из моего родного языка немецкого на английский язык]

Сейчас в общем, я решил упражнение, как это (с использованием Netbeans):

double numberOne = 10, numberTwo = 35.55; 
double result, rest; 
String conversion, numberOutput; 

result = numberTwo/numberOne; 
conversion = Double.toString(result); 
int indexOfComma = conversion.indexOf("."); 
numberOutput = conversion.substring(0, indexOfComma); 
rest = numberTwo % numberOne; 

System.out.println("The second number fits " + numberOutput + 
" times into the first one. The rest is: " + rest); 

С номерами, то система выскакивает это сообщение:

«Второе число соответствует 3 раза в первое остальное:. +5,549999999999997»

мне не нравится ошибка округления для остальных. Я ожидал, что он выдаст «5.55», как человек наберет или напишет. После небольшого поиска по всему миру кажется, что что-то, называемое «BigDecimal», является решением моей проблемы, но объяснения, которые я нашел о том, как реализовать это в Java, идут по моей голове.

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

+0

'BigDecimal' не кажется, отношение к вашей проблеме вообще. Вам просто нужно научиться форматировать выходные данные. – John3136

+0

Мое чтение «вписывается в» - это наоборот. '10' (первый номер) трижды помещается в' 35.55' (второе число). – Andreas

+0

@ John3136 Не могли бы вы уточнить? По моему мнению, формирование только сделало бы его более «красивым», как отрезание только двух последних цифр после запятой, но не помогло бы мне с исправлением ошибки округления. – Kalassar

ответ

1

BigDecimal версия кода:

BigDecimal numberOne = new BigDecimal("10"); 
BigDecimal numberTwo = new BigDecimal("35.55"); 
BigDecimal[] divRem = numberTwo.divideAndRemainder(numberOne); 
System.out.println("The second number fits " + divRem[0].stripTrailingZeros().toPlainString() + 
        " times into the first one. The rest is: " + divRem[1].stripTrailingZeros().toPlainString()); 

Выходной

The second number fits 3 times into the first one. The rest is: 5.55 
+0

Эй, спасибо alot :) Это хорошо решает проблему. – Kalassar

+0

Но первое число соответствует количеству раз во втором, а не наоборот. –

+0

@ RudyVelthuis Я согласен с вашей интерпретацией, и я так же прокомментировал вопрос. Вот почему я ответил на это «версией * вашего кода», потому что вопрос был не совсем в этом, а о том, как делать вычисления «BigDecimal». – Andreas

0

Вы можете использовать BigDecimal как

BigDecimal a = BigDecimal.valueOf(10); 
BigDecimal b = BigDecimal.valueOf(35.55); 
BigDecimal c = b.divide(a, 3, BigDecimal.HALF_UP); 
System.out.println(b + "/" + a + " = " + c); 

Или вы могли бы использовать округление как

System.out.printf("(int)(%.2f/%d) = %d%n", 35.55, 10, (int) (35.55/10)); 
System.out.printf("%.2f %% %d = %.2f%n", 35.55, 10, 35.55 % 10); 

который печатает

floor(35.55/10) = 3 
35.55 % 10 = 5.55 
+1

Ни одна из версий не печатает запрошенные номера '3' и' 5.55' (остаток). – Andreas

+0

@ Андреас Спасибо, я пропустил вопрос. –