У вас проблема с определением области охвата, поэтому получение этой ошибки:
for(int i = 0; i<nextTextBox;i++) //you are declaring i here
с использованием внутри KeyListener
. Это запрещено. Поскольку доступ к переменной local
non-final
недоступен из внутреннего класса для доступа, он должен быть окончательным. В вашем случае я не думаю, что можно сделать i
final
Итак, одно быстрое исправление объявляет i в области класса с помощью JFrame
и JPanel
JFrame myMainWindow = new JFrame("Sorts");
JPanel sortPanel = new JPanel();
int i;
, тогда используйте его где угодно
for(i = 0; i<nextTextBox;i++)
Просто используйте длинное и умножьте на степень 10. После того, как вы закончите, разделите на ту же степень на 10.
Всегда используйте Десятичное число для любых финансовых вычислений, или Вы будете навсегда преследовать погрешности округления за 1 цент.
Десятичные числа должны всегда использоваться для финансовых вычислений. Размер чисел не важен.
самый легкий путь ко мне для объяснения через некоторый код C#.
double one = 3.05;
double two = 0.05;
System.Console.WriteLine((one + two) == 3.1);
, Что бит кода распечатает Ложь даже при том, что 3.1 равно 3,1...
То же самое..., но десятичное число использования:
decimal one = 3.05m;
decimal two = 0.05m;
System.Console.WriteLine((one + two) == 3.1m);
Это теперь распечатает Верный !
, Если Вы хотите избежать этого вида проблемы, я рекомендую придерживаться десятичных чисел.
Я отсылаю Вас к своему ответу, данному этот вопрос .
Использование длинное, сохраните самую маленькую сумму, которую необходимо отследить и отобразить значения соответственно.
Так, необходимо решить, можно ли иметь дело с округлением перед вызовом ToString () или необходимо ли найти некоторый другой механизм, который будет иметь дело с округлением результатов, поскольку они преобразовываются в строку. Или можно продолжить использовать десятичную систему исчисления, так как это останется точным, и это станет быстрее, как только машины выпущены, которые поддерживают новую десятичную систему исчисления IEEE 754 в аппаратных средствах.
Обязательная перекрестная ссылка: , Что Каждый Программист Должен Знать Об Арифметике С плавающей точкой . Это - один из многих возможных URL.
информация о десятичной системе исчисления и новом стандарте IEEE 754:2008 в этом сайт Speleotrove .
Здесь существует две отделимых проблемы. Каждый - имеет ли двойное достаточно точности для содержания всех битов, в которых Вы нуждаетесь, и другой то, где она может представить Ваши числа точно.
Что касается точного представления, Вы правы быть осторожными, потому что точная десятичная дробь как 1/10 не имеет никакого точного двоичного дубликата. Однако, если Вы знаете, что Вам только нужны 5 десятичных цифр точности, можно использовать , масштабировался арифметика, в которой Вы воздействуете на числа, умноженные на 10^5. Так, например, если Вы хотите представить 23.7205 точно, Вы представляете его как 2372050.
Позволяют нам видеть, существует ли достаточно точности: двойная точность дает Вам 53 бита точности. Это эквивалентно 15 + десятичные цифры точности. Таким образом, это позволило бы Вам пять цифр после десятичной точки и 10 цифр перед десятичной точкой, которая кажется вполне достаточной для Вашего приложения.
я поместил бы этот код C в.h файл:
typedef double scaled_int;
#define SCALE_FACTOR 1.0e5 /* number of digits needed after decimal point */
static inline scaled_int adds(scaled_int x, scaled_int y) { return x + y; }
static inline scaled_int muls(scaled_int x, scaled_int y) { return x * y / SCALE_FACTOR; }
static inline scaled_int scaled_of_int(int x) { return (scaled_int) x * SCALE_FACTOR; }
static inline int intpart_of_scaled(scaled_int x) { return floor(x / SCALE_FACTOR); }
static inline int fraction_of_scaled(scaled_int x) { return x - SCALE_FACTOR * intpart_of_scaled(x); }
void fprint_scaled(FILE *out, scaled_int x) {
fprintf(out, "%d.%05d", intpart_of_scaled(x), fraction_of_scaled(x));
}
существует, вероятно, несколько грубых мест, но этого должно быть достаточно для запущения Вас.
Никакие издержки для дополнения, стоимости умножения или делятся, удваивается.
, Если у Вас есть доступ к C99, можно также попробовать масштабируемую целочисленную арифметику с помощью int64_t
64-разрядный целый тип. То, которое быстрее, будет зависеть от Вашей аппаратной платформы.