JavaScript: точност и float point

5 отговора 137 прегледа
#1

JavaScript: точност и float point

Някой да има идея дали мога да определям точността на резултатите в JavaScript, както в нормалните езици като Паскал и Ц++?...да задам приближение, да закръглява след третия символ например?...защото големи неточности се получават при float point резултатите. Най-зле е с тригонометричните функции. Пробвайте например:
window.alert(Math.sin(Math.PI*2));
Или, казано на човешки език: sin(2п), което както знаем е 0.
JavaScript обаче ми връща: -2.4492127076447545e-16, което пак е нещо много близо и около 0, но не ми върши същата работа. Друго си е да видиш една хубава кръгла 0. Единственият начин, за който се сещам, е да си направя критерий за безкрайно малко, например: 0.000000000001 и да ceil()/floor()-вам според него...Та има ли някакъв по-добър начин?...

Математиката се състои от очевидни неща подредени по подходящ начин.

Абе dir-а кога ще си оправят бъговете при корекции, баси...хм!

Редактирано от Dakota на

Отговор
в отговор на Dakota #2

може нещо от сорта


<script>
function conv(val) {
if(parseFloat(val) <= Number.MIN_VALUE) return 0;
if(parseFloat(val) >= Number.MAX_VALUE) return Number.MAX_VALUE;
return parseFloat(val.toString());
}
alert(conv(Math.sin(Math.PI*2)));
alert(conv(1/1000000000000));
</script>


В посоченият от теб случай работи ... обаче в някои други,
можеш да получиш някой exception... трябва да провериш сам.


bofh
Отговор
в отговор на bofh #3

мдам

Мда, наистина върши работа...е за моя случай не ми трябва Number.MAX_VALUE, .т.е предпочитам да връща Infinity...но пък за тригонометричните функции мога да правя:

if ((1-val)<=Number.MIN_VALUE) return 1;

10x

Btw, в JavaScript има ли exception-и? :)

Математиката се състои от очевидни неща подредени по подходящ начин.
Отговор
в отговор на Dakota #4

Re: мдам

Ако питаш дали можеш да правиш
try () { } catch () отговора както се сещаш е не
от друга страна NaN (Not a Number) примерно си е exception :P

Можеш да ползваш някои хубави неща, от сорта на :

var day = 33

if (day < 1 || day > 31) {
day = Number.NaN
alert("Денят трябва да е между 1 и 31")
}

както и проверката isNaN() ... говориме за твоя случай конкретно.

Айде :)

bofh
Отговор
в отговор на bofh #5

Re: мдам

Estestweno che ima exceptioni.
Ne sym gi probwal na NS no na IE (JScript) si poddyrja kato pich try {} catch()
Taka che mogesh da gi izpolzwash, da ne goworim che ima pone 5 funkicii za prowerka na NaN i oshte takiwa gluposti, i na finala imash onError.....
Chetete malko po-usyrdno

JAVA lets make things badly and slow!!
Отговор
в отговор на wili98 #6

:)

е аз съм чел java script reference до версия 1.2 тай че отговора ми е outdated.
a 1.4 има exceptions, прочетох преди малко.

Мерси Уили :)

bofh
Отговор