Модераторы: Sardar, Aliance

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> JS. Проблема суммирования 
:(
    Опции темы
DiMoN_TD
Дата 12.5.2008, 16:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 132
Регистрация: 16.12.2007

Репутация: нет
Всего: нет



Нашел неприятную для себя закономерность.

Если сложить два числа 0.7+0.7, то в итоге получаю 1.4
Если сложить два числа начиная от 8.4+0.7, то получаю числ 9.39999999, а числа ниже, т.е. 2.4 3.4 4.4 и т.д, дают нормальный результат... как решается эта проблема?
PM MAIL   Вверх
smartov
Дата 12.5.2008, 16:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


свой собственный
****


Профиль
Группа: Экс. модератор
Сообщений: 4225
Регистрация: 2.2.2006
Где: NJ

Репутация: 7
Всего: 259



Думаю ошибка где-то в другом месте.

user posted image
PM MAIL   Вверх
DiMoN_TD
Дата 12.5.2008, 16:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 132
Регистрация: 16.12.2007

Репутация: нет
Всего: нет



smartov, 

Я извиняюсь.. не 8.4, а 8.7

8.4 у меня тоже нормально работает =)
PM MAIL   Вверх
Ghirik
Дата 12.5.2008, 17:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 919
Регистрация: 26.3.2007

Репутация: 13
Всего: 20



Обычно используют Math.round(). Вначале умножают результат на 100-1000-10000-сколько хотите иметь знаков после запятой, а после Math.round() делят обратно.

Вы наверное в Mozill-е проводите эксперименты...

Это сообщение отредактировал(а) Ghirik - 12.5.2008, 17:08


--------------------
Отдадим всё клиенту, пускай его машина мучается...

PM MAIL   Вверх
DiMoN_TD
Дата 12.5.2008, 17:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 132
Регистрация: 16.12.2007

Репутация: нет
Всего: нет



Ghirik, 
Нет.. провожу эксперементы в Опере. В ИЕ7 тоже самое.

Добавлено через 5 минут и 9 секунд
Ghirik, 
и кстати, то что вы мне предложили, результатом работы этой функции даже целое число будет с двумя нулями после запятой, например 10.00, а мне нужно так, что если число целое - то безо всяких запятых, а если уж дробное - тогда добавляются запятые.
PM MAIL   Вверх
bars80080
Дата 12.5.2008, 17:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прапор творюет
****
Награды: 1



Профиль
Группа: Завсегдатай
Сообщений: 12022
Регистрация: 5.12.2007
Где: Königsberg

Репутация: 15
Всего: 315



да хрень какая-то
избавляться примерно таким методом:
Код

document.writeln(Math.ceil((8.7 + 0.1)*10)/10);
document.writeln(8.7 + 0.1);
 но всё же, что это за эффект
PM MAIL WWW   Вверх
webevt
Дата 12.5.2008, 17:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 235
Регистрация: 5.5.2005

Репутация: нет
Всего: 3



PM MAIL   Вверх
Ghirik
Дата 12.5.2008, 17:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 919
Регистрация: 26.3.2007

Репутация: 13
Всего: 20



Цитата

и кстати, то что вы мне предложили, результатом работы этой функции даже целое число будет с двумя нулями после запятой, например 10.00, а мне нужно так, что если число целое - то безо всяких запятых, а если уж дробное - тогда добавляются запятые. 


Ну... парсить нужно... если уж это так важно.

Math.ceil( ) наверное не совскм корректно использовать, он из 1.01 делает 2.  smile

Добавлено @ 17:53
Блин!

Вообще, какую то фигню тут обсуждаем... Мне стыдно, а Вам?

Нужно просто все вводимые значения умножать до целого числа на 10-100-1000 и т.д., потом их перемножать, а уж потом отнимать нужное количество нулей.  smile 

Это сообщение отредактировал(а) Ghirik - 12.5.2008, 17:54


--------------------
Отдадим всё клиенту, пускай его машина мучается...

PM MAIL   Вверх
DiMoN_TD
Дата 12.5.2008, 17:55 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 132
Регистрация: 16.12.2007

Репутация: нет
Всего: нет



Цитата(Ghirik @  12.5.2008,  15:42 Найти цитируемый пост)
Math.ceil( ) наверное не совскм корректно использовать, он из 1.01 делает 2. 


Это точно. Только что проверил. Полный бред получается.

В общем взял в расчет (8.4+7.4).toFixed(2); Буду с этим мучаться (

PM MAIL   Вверх
Ghirik
Дата 12.5.2008, 18:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 919
Регистрация: 26.3.2007

Репутация: 13
Всего: 20



Цитата

Нужно просто все вводимые значения умножать до целого числа на 10-100-1000 и т.д., потом их перемножать, а уж потом отнимать нужное количество нулей


Цитата

В общем взял в расчет (8.4+7.4).toFixed(2); Буду с этим мучаться (



0.7*9.7=(0.7*10)*(9.7*10)/100


--------------------
Отдадим всё клиенту, пускай его машина мучается...

PM MAIL   Вверх
DiMoN_TD
Дата 12.5.2008, 18:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 132
Регистрация: 16.12.2007

Репутация: нет
Всего: нет



Цитата(Ghirik @  12.5.2008,  16:01 Найти цитируемый пост)
0.7*9.7=(0.7*10)*(9.7*10)/100

это что, простите? =)

PM MAIL   Вверх
Ghirik
Дата 12.5.2008, 20:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 919
Регистрация: 26.3.2007

Репутация: 13
Всего: 20



Не нужно мучать результат умножения, нужно просто до того, введенные дробные числа умножить на нужное количество нулей. После этого их перемножить... результат будет корректный (ведь целые числа умножаются правильно), а потом, результат разделить на добавленное количество нулей.

Например, и меем два числа 9.7 и 0.7. Умножаем каждое на десять, получаем 97 и 7, перемножаем их, получаем 679 и делим на сто - 6.79.

Добавлено через 2 минуты и 41 секунду
Или 0.76 и 5.345 - 0.76 умножаем на 100, а 5.345 умножаем на 1000.... После перемножения, делим на 100000.


--------------------
Отдадим всё клиенту, пускай его машина мучается...

PM MAIL   Вверх
Ghirik
Дата 12.5.2008, 22:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 919
Регистрация: 26.3.2007

Репутация: 13
Всего: 20



Вот ведь бл...ин! Думал, сейчас быстренько слеплю такую считалку. Слепил, считает, но иногда браузер снова заклинивает, и выскакивают числа с астрономическим количеством знаков.
Сейчас некогда искать причину(видимо, что-то в цикле не поспевает), пока положу что есть:

Код

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta http-equiv="Content-Language" content="en-us">
<title>Title block</title>
<script type="text/javascript">
<!--
var j = 1;
zeroСonsider = function (fraction) {
    for (; /\./.test(fraction); j = j*10) {fraction = fraction*10};
    alert(fraction)
    return fraction;
}
function multiplicationFractions(txt1,txt2,txt3) {
    var a = zeroСonsider(txt1.value);
    var b = zeroСonsider(txt2.value);
    var c = a*b;
    txt3.value = c/j;
    j = 1;
}
//-->
</script>
</head>
<body>
<input type="text" id="txt1" name="txt1" size="20"><br>X<br>
<input type="text" id="txt2" name="txt2" size="20"><br>=<br>
<input type="text" id="txt3" name="txt3" size="20"><p><input type="button" value="Посчитаем" name="b1" onclick="multiplicationFractions(document.getElementById('txt1'),document.getElementById('txt2'),document.getElementById('txt3'))"></p>
</body>
</html>


Может кто вперед разберется.



Это сообщение отредактировал(а) Ghirik - 12.5.2008, 22:31


--------------------
Отдадим всё клиенту, пускай его машина мучается...

PM MAIL   Вверх
smartov
Дата 12.5.2008, 23:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


свой собственный
****


Профиль
Группа: Экс. модератор
Сообщений: 4225
Регистрация: 2.2.2006
Где: NJ

Репутация: 7
Всего: 259



Мда. Очень веселая проблема.
Проще всего ее увидеть так
Код

document.writeln( 0.1 + 0.2 );


Проблема, оказывается, старая. Обещают пофиксить в JS 2.0
Пока что кроме toFixed никаких чудес :(
PM MAIL   Вверх
ksnk
Дата 12.5.2008, 23:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 84
Всего: 386



Вот, imho,  более правильная функция
Код

function multiplicationFractions(txt1,txt2,txt3) {
    var c = txt1.value*txt2.value,t;
    if(t=c.toString().match(/(.*)\.(.*[^9])(9+)./)){
        t[2]=parseInt(t[2])+1;
        c=t[1]+'.'+t[2];
    }; 
    txt3.value=c;
}

Основная идея - при некорректном округлении получается дробь, оканчивающаяся на ...999x.
Итого - достаточно найти период из 9-ок и добавить к предшествующей части 1....

Умножение на десятичные дроби, вроде, должно работать ;-) 


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
Ответ в темуСоздание новой темы Создание опроса
Форум для вопросов, которые имеются в справочниках, но их поиск вызвал затруднения, или для разработчика требуется совет или просьба отыскать ошибку. Напоминаем: 1) чётко формулируйте вопрос, 2) приведите пример того, что уже сделано, 3) укажите явно, нужен работающий пример или подсказка о том, где найти информацию.
 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | JavaScript: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0607 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.