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

x-yuri 23.01.2011 20:39

Цитата:

Сообщение от UpJump
А что это значит?

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

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

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

а ты чего хочешь сделать?

UpJump 23.01.2011 20:57

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

x-yuri 23.01.2011 22:18

Цитата:

Сообщение от UpJump
4)отнять от этой строки ноль. то есть перевести ее в число.

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

если ты хочешь решить эту задачу, либо поищи arbitrary-precision библиотеки, либо напиши свою

UpJump 23.01.2011 22:26

мдя.. жаль. ну все равно спс.

UpJump 25.01.2011 20:16

Собственно сообразил решение поставленной(самому себе:) ) сферической задачи.
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. но для ответа до одной цифры после точки решение годится.

x-yuri 25.01.2011 21:29

собственно, это одно из правил при работе с числами с плавающей запятой: не использовать оператор ==

рони 26.01.2011 04:59

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>

Aetae 26.01.2011 05:05

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

Как-то так, имхо.
s=0.1+0.2;
alert(s)
s=+s.toFixed(10)
alert(s)

рони 26.01.2011 05:13

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

Aetae 26.01.2011 05:17

Цитата:

Сообщение от рони (Сообщение 89701)
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>


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