Сложение двух чисел

 
0
 
JavaScript
ava
GoodBoy | 19.11.2004, 15:05
http://www.zenonline.ru/good/tables/add.html
третье число - сумма 1-го и 2-го... ОТКУДА берётся 00000001??????????
Kommentare (10)
ava
guest | 19.11.2004, 15:35 #
мда херь какая-то
может от версии jscript зависит, я под винхр смотрел, а другим браузером пробовал или везде так
насколько я понимаю это цены товаров
тогда просто усекай все после копеек.
ava
sergejzr | 19.11.2004, 15:47 #
Это не Яваскрипт, это представление числа с плавающей точкой :)

Вот тоже на ту тему smilehttp://forum.vingrad.ru/index.php?showtopic=35065
А ещё поищи по форуму. Помоему ктот целую статью писал про float' ы


smilesmile
ava
GoodBoy | 19.11.2004, 15:55 #
sergej.z
Так прикол в том, что это не всегда происходит!!!!!!!!

или иногда ещё лучше бывает, при сложении
что-то.23
что-то.43
получается:
что-то.659999999999


Решаю это прогоном числа через вот эту функцию:
function cent(amount) {
   amount = ''+amount;
   var asd = amount.split(".");
   asd[1] = parseFloat("0."+asd[1]);
   asd[1] = (Math.round(asd[1]*100))/100;
   return (parseFloat(asd[0])+parseFloat(asd[1]));
}

Но это же бред!!!!!!!!!!!!!!!!!!!!
ava
Sardar | 19.11.2004, 16:31 #
GoodBoy да нормально это ! ;-)
Float числа в памяти хранятся в бинарном виде, как помним это мантисса и экспонента. В зависимости сколько битов дано на мантису и экспоненту получим множество машинных чисел, растояния между возможными числами разные, этим и обьясняется поблема с "левыми дробями". Решается всё простым округлением либо выбором типа с большей точностью(в JS не доступно).

В твоем случае просто умножь на столько, сколько чисел после запятой нужно, затем сделай что нужно и округли, затем раздели назад.
ava
GoodBoy | 19.11.2004, 16:54 #
Sardar
Дык так и делаю, но это же БРЕД!!!!!!!!!!! Тупая ведь бага! Неужели пофиксить это нельзя???
ava
sergejzr | 19.11.2004, 19:38 #
Вот, постарался ко-чего написать по теме smile Незнаю, понравится ли текст, но в конце есть линьк. Туда стоит сходить smile
http://forum.vingrad.ru/index.php?act=ST&a...27&unread=1
ava
Се ля ви | 20.11.2004, 00:40 #
GoodBoy это во всех языках программирования тоже встречается. Интел такие процессоры делает просто.. Java эту проблему решает на уровне JVM, а вот для языков по-проще это беда, которую все учатся обходить по-своему...

У меня такая трабла была, когда я Дельфи занимался давно. Очень бесило, а потом стал как-то обходить... по-моему там был нормальный тип один с плавающей точной, который считался нормально, хотя в книгах и писали что он медленней real`а, но мне хватало...
ava
Sardar | 20.11.2004, 15:13 #
Се ля ви тип наверное был decimal, т.е. отдается место под дрoбную часть(количество цифр после запятой) и под целую, в результате имеем гораздо меньший диапазон значний, но числа равномерно плотно распределенны. На прямую процессором вроде не поддерживаются.

2All не надо с этим бороться, просто когда делали JS, посчитали что точности float32 хватит, это и есть так. Например нужна точность до 3 цифры после запятой:
var a=129446.68;
var b=607382.9;
var som=(a+b)*1000;
alert(Math.round(som)/1000);
ava
sergejzr | 20.11.2004, 16:07 #
Цитата
Интел такие процессоры делает просто.

smile smile А как сделать процессор, или лучше спрошу, в каком виде представить ЛЮБОЕ дробное число?
Если, как я уже писал в интервале 0.1 - 0.2 их бесконечное количество? smile smile
ava
Sardar | 20.11.2004, 16:24 #
Цитата (sergej @ 20.11.2004, 15:07)
Если, как я уже писал в интервале 0.1 - 0.2 их бесконечное количество?

Да, в этом и есть большая проблема вещественных чисел.

Цитата (sergej @ 20.11.2004, 15:07)
А как сделать процессор, или лучше спрошу, в каком виде представить ЛЮБОЕ дробное число?

Можно представить их в decimal, где допустим 4 байта на целую и 4 байта на дробную часть. Сужается диапазон возможных чисел, но числа распределенны равновмерно и точно до своей максимальной точности - до максимально возможного в дробной части. Похоже это сделать трудно, да и не нужно в большинстве ситуаций. В точных вычислениях можно написать собственную либу или взять существующую для работы с болсьхими числами.
Registrieren Sie sich oder melden Sie sich an, um schreiben zu können.
Unternehmen des Tages
Вы также можете добавить свою фирму в каталог IT-фирм, и публиковать статьи, новости, вакансии и другую информацию от имени фирмы.
Подробнее
Mitwirkende
advanced
Absenden