Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #61 (permalink)  
Старый 26.01.2011, 05:52
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,108

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>

Math.floor проблема с округлением
Ответить с цитированием
  #62 (permalink)  
Старый 26.01.2011, 18:17
Аватар для x-yuri
Отправить личное сообщение для x-yuri Посмотреть профиль Найти все сообщения от x-yuri
 
Регистрация: 27.12.2008
Сообщений: 4,201

рони, а теперь расскажи, в каких условиях твое решение будет давать верный результат. И если ты не видишь проблему, то проблема в том, что строку '3' можно представить в виде числа без потерь точности, а строку '0.3' - нельзя
Ответить с цитированием
  #63 (permalink)  
Старый 26.01.2011, 22:18
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,108

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>
Ответить с цитированием
  #64 (permalink)  
Старый 26.01.2011, 23:12
Аватар для x-yuri
Отправить личное сообщение для x-yuri Посмотреть профиль Найти все сообщения от x-yuri
 
Регистрация: 27.12.2008
Сообщений: 4,201

У меня нету времени проверять твой скрипт для всех возможных вариантов входных значений. А если бы Aetae не подобрал значения, с которыми не справляется твой предыдущий вариант, ты б так и думал, что предыдущий вариант рабочий (Aetae вся надежда на тебя :X)
Ответить с цитированием
  #65 (permalink)  
Старый 27.01.2011, 00:49
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,108

x-yuri,
В нерабочем варианте было пропущено toFixed(0)
Вариант округления взят отсюда Math.floor проблема с округлением в тот раз против него у вас не было возражений, кроме подсказки более компактного варианта.
Ответить с цитированием
  #66 (permalink)  
Старый 27.01.2011, 01:08
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,583

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

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

Последний раз редактировалось Aetae, 27.01.2011 в 01:14.
Ответить с цитированием
  #67 (permalink)  
Старый 27.01.2011, 02:10
Аватар для x-yuri
Отправить личное сообщение для x-yuri Посмотреть профиль Найти все сообщения от x-yuri
 
Регистрация: 27.12.2008
Сообщений: 4,201

Сообщение от рони
В нерабочем варианте было пропущено 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())

просто если уж применять ваши решения, то хотелось бы знать, при каких условиях они работают. Хотя я уже приблизительно придумал, как это выяснить
Ответить с цитированием
  #68 (permalink)  
Старый 27.01.2011, 02:53
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,583

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

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

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

Последний раз редактировалось Aetae, 27.01.2011 в 02:58.
Ответить с цитированием
  #69 (permalink)  
Старый 27.01.2011, 03:22
Аватар для x-yuri
Отправить личное сообщение для x-yuri Посмотреть профиль Найти все сообщения от x-yuri
 
Регистрация: 27.12.2008
Сообщений: 4,201

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

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

т.е. он немного урезает точность и за счет этого не видно неточность преобразования строки в число. Но при всем при этом ходят слухи, что у double 16 (15.955) значащих цифр, что вводит меня в когнитивный диссонанс
Ответить с цитированием
  #70 (permalink)  
Старый 01.02.2011, 13:55
Аватар для UpJump
Профессор
Отправить личное сообщение для UpJump Посмотреть профиль Найти все сообщения от UpJump
 
Регистрация: 02.11.2010
Сообщений: 174

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

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

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



Опции темы Искать в теме
Искать в теме:

Расширенный поиск