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, время: 11:21. |