Казалось бы, простейшая программа. Вроде бы всё дописано правильно. Не будем брать в расчёт точность вычисления математических функций cos, sin и пр.
Возникает единственная ПРОБЛЕМА С ТОЧКОЙ! Срабатывает по непонятной схеме.
Вот пример:
1 + 8.1 = 9.1 (всё ОК)
8.1 + 1 = 8.11 (WTF?)
0.1 + 0.1 = 0.101 и т.д.
Т.е. при введении сначала дробного числа, а потом любого другого не работает. Что с этим делать, подскажите пожалуйста!
Мне очень важно как можно скорее довести алгоритм до ума и использовать его в ДИПЛОМЕ!

Код
// Объявляем переменные
var tablo = 0;
var num = 0;
var tochka = true;
var Numbers = 0;
var n = 1;
var Str = "";
var memory = null;
var operation = null;
// Отключаем кнопку "равно"
But_RAVNO.enabled = false;
// Код для кнопки очистки экрана
But_CLEAR.onPress = function() {
tablo = 0;
num = 0;
tochka = true;
Numbers = 0;
n = 1;
Str = "";
But_RAVNO.enabled = false;
block2(true);
block(true);
block3(true);
};
// Обработчики нажатия кнопок с цифрами
But_0.onPress = function() {
num = 0;
MyAdd();
};
But_1.onPress = function() {
num = 1;
MyAdd();
};
But_2.onPress = function() {
num = 2;
MyAdd();
};
But_3.onPress = function() {
num = 3;
MyAdd();
};
But_4.onPress = function() {
num = 4;
MyAdd();
};
But_5.onPress = function() {
num = 5;
MyAdd();
};
But_6.onPress = function() {
num = 6;
MyAdd();
};
But_7.onPress = function() {
num = 7;
MyAdd();
};
But_8.onPress = function() {
num = 8;
MyAdd();
};
But_9.onPress = function() {
num = 9;
MyAdd();
};
// Функция, отвечающая за добавление десятичной точки
But_TOCHKA.onPress = function() {
if (tochka) {
tochka = false;
Str += ".";
}
};
// Код для кнопки изменения знака
But_ZNAK.onPress = function() {
if (Str != 0 && Str != "") {
Numbers *= -1;
if (Str.substring(0, 1) != "-") {
Str = "-"+Str;
} else {
Str = Str.substring(1);
}
if (Str.length<17) {
tablo = Str;
} else {
tablo = Numbers;
}
}
};
// Функция, формирующая по нажатиям кнопок операнды
function MyAdd() {
if (tochka) {
Numbers = Numbers*10+num;
} else {
Numbers += num/Math.pow(10, n);
n++;
}
if (Str != 0) {
Str = Str+num;
} else {
Str = String(num);
}
if (Str.length<17) {
tablo = Str;
} else {
tablo = Numbers;
}
}
// Обработчики события нажатия кнопок арифметических операций
But_PLUS.onPress = function() {
calc("plus");
};
But_MINUS.onPress = function() {
calc("minus");
};
But_UMN.onPress = function() {
calc("umn");
};
But_DEL.onPress = function() {
calc("del");
};
But_STEPEN.onPress = function() {
calc("stepen");
};
// Функция, вызываемая при нажатии кнопки арифметической операции
function calc(operat) {
memory = Numbers;
Numbers = 0;
Str = "";
operation = operat;
block(false);
But_RAVNO.enabled = true;
block2(true);
block3(false);
}
// Код, производящий вычисления при нажатии кнопки "равно"
But_RAVNO.onPress = function() {
var result = null;
if (operation == "plus") {
result = memory+Numbers;
}
if (operation == "minus") {
result = memory-Numbers;
}
if (operation == "umn") {
result = memory*Numbers;
}
if (operation == "del") {
result = memory/Numbers;
}
if (operation == "stepen") {
result = Math.pow(memory, Numbers);
}
Numbers = result;
Str = result;
tablo = result;
block(true);
block2(false);
block3(true);
But_ravno.enabled = false;
};
// Функция, включающая или выключающая кнопки операций
function block(par) {
But_PLUS.enabled = par;
But_UMN.enabled = par;
But_MINUS.enabled = par;
But_DEL.enabled = par;
But_STEPEN.enabled = par;
}
// Функция, отвечающая за активность кнопок с цифрами
function block2(par) {
for (var i = 0; i<=9; i++) {
eval("But_"+i).enabled = par;
}
But_TOCHKA.enabled = par;
But_E.enabled = par;
But_PI.enabled = par;
}
// Обработчики нажатия кнопок математических функций
But_SIN.onPress = function() {
func("sin");
};
But_COS.onRelease = function() {
func("cos");
};
But_TAN.onPress = function() {
func("tan");
};
But_LN.onPress = function() {
func("ln");
};
But_ASIN.onPress = function() {
func("asin");
};
But_ACOS.onPress = function() {
func("acos");
};
But_SQRT.onPress = function() {
func("sqrt");
};
But_ROUN.onPress = function() {
func("roun");
};
// Функция, отвечающая за вычисления при нажатии кнопки математической функции
function func(par) {
var result = null;
if (par == "sin") {
result = Math.sin(Numbers/180*Math.PI);
}
if (par == "cos") {
result = Math.cos(Numbers/180*Math.PI);
}
if (par == "tan") {
result = Math.tan(Numbers/180*Math.PI);
}
if (par == "ln") {
result = Math.log(Numbers);
}
if (par == "asin") {
result = Math.asin(Numbers)/Math.PI*180;
}
if (par == "acos") {
result = Math.acos(Numbers)/Math.PI*180;
}
if (par == "sqrt") {
result = Math.sqrt(Numbers);
}
if (par == "roun") {
result = Math.round(Numbers);
}
tablo = result;
Numbers = result;
Str = String(result);
}
// Функция, отвечающая за активность кнопок математических функций
function block3(par) {
But_SIN.enabled = par;
But_COS.enabled = par;
But_TAN.enabled = par;
But_LN.enabled = par;
But_ASIN.enabled = par;
But_ACOS.enabled = par;
But_SQRT.enabled = par;
But_ROUN.enabled = par;
}
// Обработчики нажатия кнопок математических констант
But_PI.onPress = function() {
Numbers = Math.PI;
Str = String(Math.PI);
block2(false);
tablo = Math.PI;
};
But_E.onPress = function() {
Numbers = Math.E;
Str = String(Math.E);
block2(false);
tablo = Math.E;
};
var tablo = 0;
var num = 0;
var tochka = true;
var Numbers = 0;
var n = 1;
var Str = "";
var memory = null;
var operation = null;
// Отключаем кнопку "равно"
But_RAVNO.enabled = false;
// Код для кнопки очистки экрана
But_CLEAR.onPress = function() {
tablo = 0;
num = 0;
tochka = true;
Numbers = 0;
n = 1;
Str = "";
But_RAVNO.enabled = false;
block2(true);
block(true);
block3(true);
};
// Обработчики нажатия кнопок с цифрами
But_0.onPress = function() {
num = 0;
MyAdd();
};
But_1.onPress = function() {
num = 1;
MyAdd();
};
But_2.onPress = function() {
num = 2;
MyAdd();
};
But_3.onPress = function() {
num = 3;
MyAdd();
};
But_4.onPress = function() {
num = 4;
MyAdd();
};
But_5.onPress = function() {
num = 5;
MyAdd();
};
But_6.onPress = function() {
num = 6;
MyAdd();
};
But_7.onPress = function() {
num = 7;
MyAdd();
};
But_8.onPress = function() {
num = 8;
MyAdd();
};
But_9.onPress = function() {
num = 9;
MyAdd();
};
// Функция, отвечающая за добавление десятичной точки
But_TOCHKA.onPress = function() {
if (tochka) {
tochka = false;
Str += ".";
}
};
// Код для кнопки изменения знака
But_ZNAK.onPress = function() {
if (Str != 0 && Str != "") {
Numbers *= -1;
if (Str.substring(0, 1) != "-") {
Str = "-"+Str;
} else {
Str = Str.substring(1);
}
if (Str.length<17) {
tablo = Str;
} else {
tablo = Numbers;
}
}
};
// Функция, формирующая по нажатиям кнопок операнды
function MyAdd() {
if (tochka) {
Numbers = Numbers*10+num;
} else {
Numbers += num/Math.pow(10, n);
n++;
}
if (Str != 0) {
Str = Str+num;
} else {
Str = String(num);
}
if (Str.length<17) {
tablo = Str;
} else {
tablo = Numbers;
}
}
// Обработчики события нажатия кнопок арифметических операций
But_PLUS.onPress = function() {
calc("plus");
};
But_MINUS.onPress = function() {
calc("minus");
};
But_UMN.onPress = function() {
calc("umn");
};
But_DEL.onPress = function() {
calc("del");
};
But_STEPEN.onPress = function() {
calc("stepen");
};
// Функция, вызываемая при нажатии кнопки арифметической операции
function calc(operat) {
memory = Numbers;
Numbers = 0;
Str = "";
operation = operat;
block(false);
But_RAVNO.enabled = true;
block2(true);
block3(false);
}
// Код, производящий вычисления при нажатии кнопки "равно"
But_RAVNO.onPress = function() {
var result = null;
if (operation == "plus") {
result = memory+Numbers;
}
if (operation == "minus") {
result = memory-Numbers;
}
if (operation == "umn") {
result = memory*Numbers;
}
if (operation == "del") {
result = memory/Numbers;
}
if (operation == "stepen") {
result = Math.pow(memory, Numbers);
}
Numbers = result;
Str = result;
tablo = result;
block(true);
block2(false);
block3(true);
But_ravno.enabled = false;
};
// Функция, включающая или выключающая кнопки операций
function block(par) {
But_PLUS.enabled = par;
But_UMN.enabled = par;
But_MINUS.enabled = par;
But_DEL.enabled = par;
But_STEPEN.enabled = par;
}
// Функция, отвечающая за активность кнопок с цифрами
function block2(par) {
for (var i = 0; i<=9; i++) {
eval("But_"+i).enabled = par;
}
But_TOCHKA.enabled = par;
But_E.enabled = par;
But_PI.enabled = par;
}
// Обработчики нажатия кнопок математических функций
But_SIN.onPress = function() {
func("sin");
};
But_COS.onRelease = function() {
func("cos");
};
But_TAN.onPress = function() {
func("tan");
};
But_LN.onPress = function() {
func("ln");
};
But_ASIN.onPress = function() {
func("asin");
};
But_ACOS.onPress = function() {
func("acos");
};
But_SQRT.onPress = function() {
func("sqrt");
};
But_ROUN.onPress = function() {
func("roun");
};
// Функция, отвечающая за вычисления при нажатии кнопки математической функции
function func(par) {
var result = null;
if (par == "sin") {
result = Math.sin(Numbers/180*Math.PI);
}
if (par == "cos") {
result = Math.cos(Numbers/180*Math.PI);
}
if (par == "tan") {
result = Math.tan(Numbers/180*Math.PI);
}
if (par == "ln") {
result = Math.log(Numbers);
}
if (par == "asin") {
result = Math.asin(Numbers)/Math.PI*180;
}
if (par == "acos") {
result = Math.acos(Numbers)/Math.PI*180;
}
if (par == "sqrt") {
result = Math.sqrt(Numbers);
}
if (par == "roun") {
result = Math.round(Numbers);
}
tablo = result;
Numbers = result;
Str = String(result);
}
// Функция, отвечающая за активность кнопок математических функций
function block3(par) {
But_SIN.enabled = par;
But_COS.enabled = par;
But_TAN.enabled = par;
But_LN.enabled = par;
But_ASIN.enabled = par;
But_ACOS.enabled = par;
But_SQRT.enabled = par;
But_ROUN.enabled = par;
}
// Обработчики нажатия кнопок математических констант
But_PI.onPress = function() {
Numbers = Math.PI;
Str = String(Math.PI);
block2(false);
tablo = Math.PI;
};
But_E.onPress = function() {
Numbers = Math.E;
Str = String(Math.E);
block2(false);
tablo = Math.E;
};
Исходник тут http://rghost.ru/38702893