1. Рассчитайте с помощью js
12,32*7 Какой результат? Ответ: 86.24000000000001
Почему возникает эта проблема? Как это решить?
В js есть ошибка при работе с умножением и делением десятичных дробей. Решение может быть следующим: преобразовать десятичные числа в целые числа для обработки.
Приведенный выше расчет можно изменить на:
12,32*100*7/100
Результат: 86,24, правильно.
Также сделайте некоторые расчеты:
8,80*100*12/100
Результат: 105.60000000000002
Аналогичные проблемы возникнут и с 38.80.
Точность увеличена в 10 раз:
8,80*1000*12/1000
Результат: 105,6
Это нормально.
16,40*1000000*6/1000000
Также есть проблема с результатом
Чтобы сделать выполнение js более точным, при будущих десятичных вычислениях js непосредственно увеличьте значение в 10 000 раз, а затем разделите его на 10 000, чтобы решить проблему.
варнум = 38,80;
вар num2 = 13;
предупреждение (число * 10000 * 12/10000);
Число, которое нужно умножить и разделить, было проверено и оказалось равным 10 000. Если оно меньше, некоторые числа вызовут проблемы. Если оно больше (1 000 000), некоторые числа также вызовут проблемы.
два,
Скопируйте код кода следующим образом:
<отсрочка сценария>
Number.prototype.rate=function(){
varoStr=this.toString();
если(oStr.indexOf(".")==-1)
возврат1;
еще
returnMath.pow(10,parseInt(oStr.length-oStr.indexOf(".")-1));
}
функциятран(){
args=tran.arguments;
вартемп=1;
for(i=0;i<args.length;i++)
temp*=args[i]*args[i].rate();
for(i=0;i<args.length;i++)
temp/=args[i].rate();
температура возврата
}
оповещение(тран(11,22.9));
</скрипт>
Это решение немного более громоздкое, но оно дает представление о реальном процессе решения этой проблемы.
Скопируйте код кода следующим образом:
//Функция деления, используемая для получения точных результатов деления
//Примечание: результат деления JavaScript будет содержать ошибки, которые будут более очевидны при делении двух чисел с плавающей запятой. Эта функция возвращает более точный результат деления.
//Вызов: accDiv(arg1,arg2)
//Возвращаемое значение: точный результат деления arg1 на arg2
функция accDiv(arg1,arg2){
вар t1=0,t2=0,r1,r2;
try{t1=arg1.toString().split(".")[1].length}catch(e){}
try{t2=arg2.toString().split(".")[1].length}catch(e){}
с (Математика) {
r1=Number(arg1.toString().replace(".",""))
r2=Number(arg2.toString().replace(".",""))
return (r1/r2)*pow(10,t2-t1);
}
}
//Добавляем метод div к типу Number, чтобы его было удобнее вызывать.
Number.prototype.div = функция (arg){
вернуть AccDiv (это, arg);
}
//Функция умножения, используемая для получения точных результатов умножения
//Примечание. Результат умножения JavaScript будет содержать ошибки, что будет более очевидно при умножении двух чисел с плавающей запятой. Эта функция возвращает более точный результат умножения.
//Вызов: accMul(arg1,arg2)
//Возвращаемое значение: точный результат умножения arg1 на arg2
функция accMul(arg1,arg2)
{
вар m=0,s1=arg1.toString(),s2=arg2.toString();
попробуйте {m+=s1.split(".")[1].length}catch(e){}
попробуйте {m+=s2.split(".")[1].length}catch(e){}
return Number(s1.replace(".",""))*Number(s2.replace(".",""))/Math.pow(10,m)
}
// Добавляем метод mul к типу Number, чтобы его было удобнее вызывать.
Number.prototype.mul = функция (arg){
вернуть accMul(arg, это);
}
//Функция сложения, используемая для получения точных результатов сложения
//Примечание: результат сложения JavaScript будет содержать ошибки, что будет более очевидно при добавлении двух чисел с плавающей запятой. Эта функция возвращает более точный результат сложения.
//Вызов: accAdd(arg1,arg2)
// Возвращаемое значение: точный результат arg1 плюс arg2
функция accAdd(arg1,arg2){
вар r1,r2,m;
try{r1=arg1.toString().split(".")[1].length}catch(e){r1=0}
попробуйте {r2=arg2.toString().split(".")[1].length}catch(e){r2=0}
m=Math.pow(10,Math.max(r1,r2))
возврат (arg1*m+arg2*m)/m
}
//Добавляем метод add к типу Number, чтобы его было удобнее вызывать.
Number.prototype.add = функция (arg){
вернуть accAdd(arg,this);
}