<script> var x = 5.4444444444444444449 var y = 5.6785069743950934609 x = x.toFixed(2); y = y.toFixed(2); x=x-0; y=y-0; document.write("Первое число : " +x+"<br>"); document.write("Второе число : " +y+"<br>"); var result = x+y; document.write("Сумма : "+result); </script> Сумма выходит не совсем такая какая ожидается. Насколько я понимаю происходит округление. Как тут быть? Сумма-то не совпадает.:blink: Есть ли альтернативное "верное" решение? |
Цитата:
Цитата:
|
Ясно. Слушай x-yuri, ты уже второй раз говоришь о "сферическом". А что это значит? Так для саморазвития.:)
|
Цитата:
|
|
как можно стопроцентов получить рандомное число с количеством цифр после десятичной точки к примеру 2?
То есть число.xx? toFixed() не дал результата(выше спрашивал). Пробывал так. var x = (Math.random() - Math.random())*100; x = (x.toString().substr(0,4))-0; тоже ничего. |
var max=100 alert( (Math.random()*max).toFixed(2) ) |
Нет. ты не понял. Я задавал вопрос выше на этой странице.http://javascript.ru/forum/misc/1442...html#post89307
Если я сделаю вычитание одного такого числа из другого то не всегда получу "правильный" результат.Надеюсь понятно.:) |
Дык всё равно toFixed на резульат.
|
нет. меня интересует только чистое число с двумя цифрами после точки. Посмотри пример что я тебе указал. там результат не тот какой хотелось бы. А именно нужен 11.12.
|
Цитата:
в финансовых вычислениях, например, используется arbitrary-precision arithmetic но в большинстве реальных задач это не имеет смысла а ты чего хочешь сделать? |
это просто небольшая задачка для себя самого. смысл:
Я получаю пример в виде суммы из двух чисел. числа генерятся рандомно, причем цифры должны быть с дробной частью, но к примеру с двумя цифрами после точки. Далее вызывается prompt(). Я ввожу ответ. и он проверяется. И тут облом. оказывается ответ который я ввожу неверен. собственно это все. ничего для спасения мира:) UPD Пробывал даже так: 1)получить рандомное число 2)перевести его в строку 3).substr(0,4) этой строки 4)отнять от этой строки ноль. то есть перевести ее в число. |
Цитата:
если ты хочешь решить эту задачу, либо поищи arbitrary-precision библиотеки, либо напиши свою |
мдя.. жаль. ну все равно спс.
|
Собственно сообразил решение поставленной(самому себе:) ) сферической задачи.
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,
<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> |
рони,
Это решение только для данного конкретного случая, деление тоже может дать неточный результат. Как-то так, имхо. s=0.1+0.2; alert(s) s=+s.toFixed(10) alert(s) |
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, ок )))
<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"); будет проверять тип данных. Но что проверяется в первом случае? |
в первом случае объект сранивается со строкой. В каком разделе у него такой код?
|
Все само разрешилось. Извиняюсь за чухню которую написал. Недосмотрел код.
|
Вообще можно и так
alert({}=='[object Object]') но так делать нельзя.))) |
В данном случае будет просто вызван метод toString операнда. Примерно таким образом, ЕМНИП, рекомендуют проводить проверку на массив:
var arr = []; alert(Object.prototype.toString.call(arr) === '[object Array]'); |
Эт ясно, только разные браузеры методом toString могут такой чухни понаписать) Если с object и array ещё нормально то dom элементы весьма разнятся.
|
Всем привет. Это снова я:write:
var str = 'hello "Java"'; alert(str.match(/a|"([^"]*)"/)); Собственно не понял почему не происходит выборка символа а в массив. Ведь при проверке текста с помощью к примеру /x|y/если найден x то y искаться уже не должен. |
Цитата:
|
блин что-то все равно в голове не уляжеться. а как тогда изменить что бы вначале нашел а но не удаляя вторую часть условия?
("([^"])*")То есть искать а. если не найдено то искать ("([^"])*") |
Кажется понял.
var str = 'hello "Java"'; alert(str.match(/a|"([^"]*)"/)); При выборке он проверяет каждый символ в строке и для каждого символа выполняет условие или. То есть вначале он проверяет h(если символ соответствует первому условию то записывает в массив, если нет то проверяет второе условие) затем e и так далее. То есть по очередности для каждого символа, а не первое условие на всю строку а затем второе условие на всю строку. Я все правильно понял? |
Цитата:
|
Часовой пояс GMT +3, время: 05:52. |