Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #51 (permalink)  
Старый 23.01.2011, 20:39
Аватар для x-yuri
Отправить личное сообщение для x-yuri Посмотреть профиль Найти все сообщения от x-yuri
 
Регистрация: 27.12.2008
Сообщений: 4,201

Сообщение от UpJump
А что это значит?
я имел в виду, что непонятно, чего ты пытаешься добиться. А в приложении типа введите-число-получите-сумму точность не имеет значения

в финансовых вычислениях, например, используется arbitrary-precision arithmetic

но в большинстве реальных задач это не имеет смысла

а ты чего хочешь сделать?
Ответить с цитированием
  #52 (permalink)  
Старый 23.01.2011, 20:57
Аватар для UpJump
Профессор
Отправить личное сообщение для UpJump Посмотреть профиль Найти все сообщения от UpJump
 
Регистрация: 02.11.2010
Сообщений: 174

это просто небольшая задачка для себя самого. смысл:
Я получаю пример в виде суммы из двух чисел. числа генерятся рандомно, причем цифры должны быть с дробной частью, но к примеру с двумя цифрами после точки. Далее вызывается prompt(). Я ввожу ответ. и он проверяется. И тут облом. оказывается ответ который я ввожу неверен. собственно это все. ничего для спасения мира
UPD
Пробывал даже так:
1)получить рандомное число
2)перевести его в строку
3).substr(0,4) этой строки
4)отнять от этой строки ноль. то есть перевести ее в число.

Последний раз редактировалось UpJump, 23.01.2011 в 21:31.
Ответить с цитированием
  #53 (permalink)  
Старый 23.01.2011, 22:18
Аватар для x-yuri
Отправить личное сообщение для x-yuri Посмотреть профиль Найти все сообщения от x-yuri
 
Регистрация: 27.12.2008
Сообщений: 4,201

Сообщение от UpJump
4)отнять от этой строки ноль. то есть перевести ее в число.
здесь теряется точность. Нельзя любое число представить в формате IEEE 754 без потери точности. Упрощенно можно считать, что этот формат допускает некоторый фиксированный ряд чисел, и при преобразовании выбирается ближайшее из этого ряда

если ты хочешь решить эту задачу, либо поищи arbitrary-precision библиотеки, либо напиши свою
Ответить с цитированием
  #54 (permalink)  
Старый 23.01.2011, 22:26
Аватар для UpJump
Профессор
Отправить личное сообщение для UpJump Посмотреть профиль Найти все сообщения от UpJump
 
Регистрация: 02.11.2010
Сообщений: 174

мдя.. жаль. ну все равно спс.
Ответить с цитированием
  #55 (permalink)  
Старый 25.01.2011, 20:16
Аватар для UpJump
Профессор
Отправить личное сообщение для UpJump Посмотреть профиль Найти все сообщения от UpJump
 
Регистрация: 02.11.2010
Сообщений: 174

Собственно сообразил решение поставленной(самому себе ) сферической задачи.
sum = 0.1 + 0.2;
x = prompt("0.1 + 0.2 == ?")
if(sum == x)alert("true");else alert("false");

Естественно будет не 0.3 т.к. погрешность
alert(0.1 + 0.2);

Зато это можно обойти так.
sum = 0.1 + 0.2;
x = prompt("0.1 + 0.2 == ?")
if(sum-0.01<x&&x<sum+0.01)alert("true");else alert("false");

Как бы создав поле допустимой погрешности.
UPD
Естественно если мы введем ответ 2.999999999999 то результат тоже будет true. но для ответа до одной цифры после точки решение годится.

Последний раз редактировалось UpJump, 25.01.2011 в 20:21.
Ответить с цитированием
  #56 (permalink)  
Старый 25.01.2011, 21:29
Аватар для x-yuri
Отправить личное сообщение для x-yuri Посмотреть профиль Найти все сообщения от x-yuri
 
Регистрация: 27.12.2008
Сообщений: 4,201

собственно, это одно из правил при работе с числами с плавающей запятой: не использовать оператор ==
Ответить с цитированием
  #57 (permalink)  
Старый 26.01.2011, 04:59
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,108

UpJump,
<script>
var x = 5.4444444444444444449;
var y = 5.6785069743950934609;
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)/s;
document.write("Сумма : "+result);
</script>
Ответить с цитированием
  #58 (permalink)  
Старый 26.01.2011, 05:05
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,582

рони,
Это решение только для данного конкретного случая, деление тоже может дать неточный результат.

Как-то так, имхо.
s=0.1+0.2;
alert(s)
s=+s.toFixed(10)
alert(s)
Ответить с цитированием
  #59 (permalink)  
Старый 26.01.2011, 05:13
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,108

Aetae,
Приведи неработающий пример для моего варианта?

Последний раз редактировалось рони, 26.01.2011 в 05:16.
Ответить с цитированием
  #60 (permalink)  
Старый 26.01.2011, 05:17
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,582

Сообщение от рони Посмотреть сообщение
Aetae,
Приведи неработающий пример для моего варианта?
Ты предлагаешь мне вручную подобрать? А если подумать?

Впрочем, простой цикл и Math.round() сделал это за меня:
<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)/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)/s;
document.write("Сумма : "+result);
</script>

Последний раз редактировалось Aetae, 26.01.2011 в 05:31.
Ответить с цитированием
Ответ



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

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