Случайные аномалии вычислений в Java-программеJAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Случайные аномалии вычислений в Java-программе

Сообщение Anonymous »

У меня есть Java-программа, которую я создаю, в которой есть некоторые аномалии случайных вычислений. Программа работает следующим образом: игрок может тратить деньги на акции, а затем в течение 10 игровых ходов деньги возвращаются игроку либо с увеличением, либо с уменьшением стоимости акций (увеличение или уменьшение может варьироваться от 25% до 399%). ).
пример блока кода содержит следующие переменные...
none,skipturn1 и start1 являются логическими значениями
calc1 и Calc2 — значения типа Double
Все остальные переменные — значения типа Int

Код: Выделить всё

if ((playturn1 == 10) || (playturn1 == 20) || (playturn1 == 30) || (playturn1 == 40)) {
if ((skipturn1 == false) && (stock1 > 0) && (start11 == false)) {
start11 = true;
int stockresults1 = new Random().nextInt(74)+25;
int stockresults11 = new Random().nextInt(10)-6;
int stockresults111 = new Random().nextInt(10)+1;
if (stockresults11 < 0) {
stockresults11 = 0;
}

else {
none = false;
}

calc1 = stockresults1;
calc1 = calc1 / 100;
calc1 = calc1 + 1;
calc1 = calc1 + stockresults11;
calc2 = calc1 - 1;
calc2 = calc2 * 100;
calc3 = (int)calc2;
calc2 = stock1 * calc1;
calc1 = calc2 - stock1;
calc1 = stock1 - calc1;
calc1 = calc1 * 10;
calc1 = calc1 + 5;
calc1 = (int)calc1;
calc1 = calc1 / 10;
calc4 = (int)calc1;
calc2 = calc2 * 10;
calc2 = calc2 + 5;
calc2 = (int)calc2;
calc2 = calc2 / 10;
calc5 = (int)calc2;

if (calc4 < 0) {
calc4 = 0;
}

else {
none = false;
}

if (stockresults111 < 5) {
JOptionPane.showMessageDialog(null, "Your stock investment has matured and is ready to withdraw.

The value of your investment has decreased by " + calc3 + "%. Your stock investment is currently worth $" + calc4 + ".
You have deposited this amount into your account. Collect $" + calc4 + ".");
stock1 = 0;
money1 = money1 + calc4;
frame.dispose();
skipturn1 = true;

} else if (stockresults111 > 4) {
JOptionPane.showMessageDialog(null, "Your stock investment has matured and is ready to withdraw.

The value of your investment has increased by " + calc3 + "%. Your stock investment is currently worth $" + calc5 + ".
You have deposited this amount into your account. Collect $" + calc5 + ".");
stock1 = 0;
money1 = money1 + calc5;
frame.dispose();
skipturn1 = true;

} else {
none = false;
}
}
}
При тестировании в 95 % случаев код работает безупречно. Однако иногда я получаю некоторые случайные аномалии вычислений, когда расчеты моих программ будут отличаться от целого числа до 25. Один из примеров этого, который произошел во время тестирования, произошел, когда у меня значение запаса1 было равно 1000. Увеличение стоимости моих акций на 39 % произошло, что должно было дать следующие результаты.
1000 * 1,39 = 1390
Однако моя программа вместо этого достигла следующего результата: 1400
Я подумал, что это может быть ошибка округления из-за того, что я использовал двойное значение, а не значение bigdecimal, однако я не понимаю, как такая ошибка может привести к таким далеким результатам ( и только в очень редких случаях).
Я также проверил эту теорию с помощью тестовой программы, используя те же значения, которые вызвали эту ошибку в моей основной программе, чтобы посмотреть, смогу ли я дублировать ошибка.

Код: Выделить всё

import static java.lang.System.out;
public class test {
public static void main(String[] args) {
double a = 1.39;
int b = 1000;
a = b * a;
a = a * 10;
a = a + 5;
a = (int)a;
a = a / 10;
b = (int)a;
out.println(b);
}
}
Однако тестовая программа достигла правильного результата — 1390. Я не понимаю, почему возникает эта случайная аномалия.

Подробнее здесь: https://stackoverflow.com/questions/791 ... va-program
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»