Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   UpJump: Q&A :) (https://javascript.ru/forum/misc/14421-upjump-q.html)

рони 26.01.2011 05:52

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

x-yuri 26.01.2011 18:17

рони, а теперь расскажи, в каких условиях твое решение будет давать верный результат. И если ты не видишь проблему, то проблема в том, что строку '3' можно представить в виде числа без потерь точности, а строку '0.3' - нельзя

рони 26.01.2011 22:18

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>

x-yuri 26.01.2011 23:12

У меня нету времени проверять твой скрипт для всех возможных вариантов входных значений. А если бы Aetae не подобрал значения, с которыми не справляется твой предыдущий вариант, ты б так и думал, что предыдущий вариант рабочий (Aetae вся надежда на тебя :X)

рони 27.01.2011 00:49

x-yuri,
В нерабочем варианте было пропущено toFixed(0)
Вариант округления взят отсюда Math.floor проблема с округлением в тот раз против него у вас не было возражений, кроме подсказки более компактного варианта.

Aetae 27.01.2011 01:08

Я так и не понял зачем все эти надмозги.
Number.prototype.toNumFixed=function(n){return +this.toFixed(+n||15)}
alert((0.1+0.2).toNumFixed())

Этого достаточно чтоб избавиться от погрешности.

x-yuri 27.01.2011 02:10

Цитата:

Сообщение от рони
В нерабочем варианте было пропущено toFixed(0)

а что в этом варианте пропущено?

Цитата:

Сообщение от рони
в тот раз против него у вас не было возражений, кроме подсказки более компактного варианта.

Совершенству нет предела )))

Цитата:

Сообщение от Aetae
Я так и не понял зачем все эти надмозги.

для задачи UpJump твой вариант подходит (скорее всего, надо проверить). Но в следующем случае, например, уже не работает:
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())

просто если уж применять ваши решения, то хотелось бы знать, при каких условиях они работают. Хотя я уже приблизительно придумал, как это выяснить

Aetae 27.01.2011 02:53

Дык это понятно, погрешность накапливается. Для общего случая округление до 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()])

Но эт маловероятно в реальной практике.

Да и вообще по-хорошему нужно указывать вручную до какого знака округлять.

x-yuri 27.01.2011 03:22

Цитата:

Сообщение от Aetae
Но эт маловероятно в реальной практике.
Да и вообще по-хорошему нужно указывать вручную до какого знака округлять.

именно. Это не важно в реальной практике и нужно указывать до какого знака округлять. Но мы ведь сейчас не о реальной практике говорим :lol: хотя я даже знаю пример полусферической практики, где эта проблема стоит, только там нужны вычисления с произвольной точностью: калькулятор

а вообще, мне уже просто интересно, как интерпретатор преобразовывает строку в число и наоборот. Например, при преобразовании в строку он похоже округляет до 16 знака
alert([0.30000000000000001, 0.30000000000000009])

т.е. он немного урезает точность и за счет этого не видно неточность преобразования строки в число. Но при всем при этом ходят слухи, что у double 16 (15.955) значащих цифр, что вводит меня в когнитивный диссонанс

UpJump 01.02.2011 13:55

Всем снова привет:)
Читаю Флэнагана. Есть у него похожий код.
var o = {};
alert(o == "object");

В чем подвох? разве тут нет объекта? Я понимаю что
var o = {};
alert(typeof o == "object");

будет проверять тип данных. Но что проверяется в первом случае?


Часовой пояс GMT +3, время: 11:21.