Aetae, ок )))
<script>
var x = 70.40234624004941;
var y = 4.785769407478535;
var f = 2;
x = x.toFixed(f);
y = y.toFixed(f);
document.write("Первое число : "+x+"<br>");
document.write("Второе число : "+y+"<br>");
var s=Math.pow(10,f);
var result = (x*s+y*s).toFixed(0)/s;
document.write("Сумма : "+result);
</script>
<br>
<script>
var x = 9.244540723646633;
var y = 71.35153269338788;
var f = 2;
x = x.toFixed(f);
y = y.toFixed(f);
document.write("Первое число : "+x+"<br>");
document.write("Второе число : "+y+"<br>");
var s=Math.pow(10,f);
var result = (x*s+y*s).toFixed(0)/s;
document.write("Сумма : "+result);
</script>
http://javascript.ru/forum/css-html/...gleniem-2.html |
рони, а теперь расскажи, в каких условиях твое решение будет давать верный результат. И если ты не видишь проблему, то проблема в том, что строку '3' можно представить в виде числа без потерь точности, а строку '0.3' - нельзя
|
x-yuri,
Разве сумма в данном скрипте не верна?
<script>
var x = 100*Math.random();
var y = 100*Math.random();
var f = 2;
x = x.toFixed(f);
y = y.toFixed(f);
document.write("Первое число : "+x+"<br>");
document.write("Второе число : "+y+"<br>");
var s=Math.pow(10,f);
var result = (x*s+y*s).toFixed(0)/s;
document.write("Сумма : "+result);
</script>
|
У меня нету времени проверять твой скрипт для всех возможных вариантов входных значений. А если бы Aetae не подобрал значения, с которыми не справляется твой предыдущий вариант, ты б так и думал, что предыдущий вариант рабочий (Aetae вся надежда на тебя :X)
|
x-yuri,
В нерабочем варианте было пропущено toFixed(0) Вариант округления взят отсюда Math.floor проблема с округлением в тот раз против него у вас не было возражений, кроме подсказки более компактного варианта. |
Я так и не понял зачем все эти надмозги.
Number.prototype.toNumFixed=function(n){return +this.toFixed(+n||15)}
alert((0.1+0.2).toNumFixed())
Этого достаточно чтоб избавиться от погрешности. |
Цитата:
Цитата:
Цитата:
Number.prototype.toNumFixed=function(n){return +this.toFixed(+n||15)}
alert((0.1+0.1+0.1+0.1+0.1+0.1+0.1+0.1+0.1+0.1+0.1+0.1 +0.1+0.1+0.1+0.1+0.1+0.1+0.1+0.1+0.1+0.1+0.1+0.1+0.1+0.1+0.1+0.1+0.1+0.1+0.1).toNumFixed())
просто если уж применять ваши решения, то хотелось бы знать, при каких условиях они работают. Хотя я уже приблизительно придумал, как это выяснить |
Дык это понятно, погрешность накапливается. Для общего случая округление до 15 знаков - достаточно, чтоб наверняка - можно взять 10.
Естесно никто не застрахован от:
Number.prototype.toNumFixed=function(n){return +this.toFixed(+n||10)}
i=10000;
n=0
while(i--)n+=0.1
alert([n,n.toNumFixed()])
Но эт маловероятно в реальной практике. Да и вообще по-хорошему нужно указывать вручную до какого знака округлять. |
Цитата:
а вообще, мне уже просто интересно, как интерпретатор преобразовывает строку в число и наоборот. Например, при преобразовании в строку он похоже округляет до 16 знака alert([0.30000000000000001, 0.30000000000000009]) т.е. он немного урезает точность и за счет этого не видно неточность преобразования строки в число. Но при всем при этом ходят слухи, что у double 16 (15.955) значащих цифр, что вводит меня в когнитивный диссонанс |
Всем снова привет:)
Читаю Флэнагана. Есть у него похожий код.
var o = {};
alert(o == "object");
В чем подвох? разве тут нет объекта? Я понимаю что
var o = {};
alert(typeof o == "object");
будет проверять тип данных. Но что проверяется в первом случае? |
| Часовой пояс GMT +3, время: 21:16. |