пример блока кода содержит следующие переменные...
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;
}
}
}
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);
}
}
Подробнее здесь: https://stackoverflow.com/questions/791 ... va-program
Мобильная версия