| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > JavaScript: Общие вопросы > JS. Проблема суммирования |
| Автор: DiMoN_TD 12.5.2008, 16:22 |
| Нашел неприятную для себя закономерность. Если сложить два числа 0.7+0.7, то в итоге получаю 1.4 Если сложить два числа начиная от 8.4+0.7, то получаю числ 9.39999999, а числа ниже, т.е. 2.4 3.4 4.4 и т.д, дают нормальный результат... как решается эта проблема? |
| Автор: smartov 12.5.2008, 16:44 |
Думаю ошибка где-то в другом месте.![]() |
| Автор: DiMoN_TD 12.5.2008, 16:48 |
| smartov, Я извиняюсь.. не 8.4, а 8.7 8.4 у меня тоже нормально работает =) |
| Автор: Ghirik 12.5.2008, 17:05 |
| Обычно используют Math.round(). Вначале умножают результат на 100-1000-10000-сколько хотите иметь знаков после запятой, а после Math.round() делят обратно. Вы наверное в Mozill-е проводите эксперименты... |
| Автор: DiMoN_TD 12.5.2008, 17:10 |
| Ghirik, Нет.. провожу эксперементы в Опере. В ИЕ7 тоже самое. Добавлено через 5 минут и 9 секунд Ghirik, и кстати, то что вы мне предложили, результатом работы этой функции даже целое число будет с двумя нулями после запятой, например 10.00, а мне нужно так, что если число целое - то безо всяких запятых, а если уж дробное - тогда добавляются запятые. |
| Автор: bars80080 12.5.2008, 17:24 | ||
| да хрень какая-то избавляться примерно таким методом:
|
| Автор: webevt 12.5.2008, 17:26 |
| DiMoN_TD, Math.ceil( ); http://wdh.suncloud.ru/js12.htm#ref3122 |
| Автор: Ghirik 12.5.2008, 17:42 | ||
Ну... парсить нужно... если уж это так важно. Math.ceil( ) наверное не совскм корректно использовать, он из 1.01 делает 2. Добавлено @ 17:53 Блин! Вообще, какую то фигню тут обсуждаем... Мне стыдно, а Вам? Нужно просто все вводимые значения умножать до целого числа на 10-100-1000 и т.д., потом их перемножать, а уж потом отнимать нужное количество нулей. |
| Автор: Ghirik 12.5.2008, 18:01 | ||||
0.7*9.7=(0.7*10)*(9.7*10)/100 |
| Автор: DiMoN_TD 12.5.2008, 18:49 |
это что, простите? =) |
| Автор: Ghirik 12.5.2008, 20:17 |
| Не нужно мучать результат умножения, нужно просто до того, введенные дробные числа умножить на нужное количество нулей. После этого их перемножить... результат будет корректный (ведь целые числа умножаются правильно), а потом, результат разделить на добавленное количество нулей. Например, и меем два числа 9.7 и 0.7. Умножаем каждое на десять, получаем 97 и 7, перемножаем их, получаем 679 и делим на сто - 6.79. Добавлено через 2 минуты и 41 секунду Или 0.76 и 5.345 - 0.76 умножаем на 100, а 5.345 умножаем на 1000.... После перемножения, делим на 100000. |
| Автор: Ghirik 12.5.2008, 22:30 | ||
| Вот ведь бл...ин! Думал, сейчас быстренько слеплю такую считалку. Слепил, считает, но иногда браузер снова заклинивает, и выскакивают числа с астрономическим количеством знаков. Сейчас некогда искать причину(видимо, что-то в цикле не поспевает), пока положу что есть:
Может кто вперед разберется. |
| Автор: smartov 12.5.2008, 23:18 | ||
| Мда. Очень веселая проблема. Проще всего ее увидеть так
Проблема, оказывается, старая. Обещают пофиксить в JS 2.0 Пока что кроме toFixed никаких чудес :( |
| Автор: ksnk 12.5.2008, 23:39 | ||
Вот, imho, более правильная функция
Основная идея - при некорректном округлении получается дробь, оканчивающаяся на ...999x. Итого - достаточно найти период из 9-ок и добавить к предшествующей части 1.... Умножение на десятичные дроби, вроде, должно работать ;-) |
| Автор: solenko 13.5.2008, 03:36 |
| Я, вообще-то, немного удивлен... То, что 0,7+0,3 != 1 справедливо для всех языков. Связано это с http://ru.wikipedia.org/wiki/Плавающая_запятая и лечится кк раз приведением к типу (что и делает toFixed). Так может все таки не стоит изобретать велосипедов? |
| Автор: Ghirik 13.5.2008, 04:37 | ||||||||
Ну, дак-ть, попросили турбовеломобиль:
ksnk, что то я не догоняю... |
| Автор: ksnk 13.5.2008, 08:18 |
Дык! В добавок, отсутствует гарантия, что в результате деления целого числа на степень 10 мы получим небесконечную "десятичную" дробь ;-) Кто их , этих реализаторов, разберет... alert(0.3+0.7) выдает 1 для JavaScript Добавлено через 6 минут и 22 секунды И для php, кстати |
| Автор: smartov 13.5.2008, 11:18 |
| Откровенно говоря я не вижу особого смысла делать преобразования и городить огороды до получения конечного результата, который, в свою очередь, легко преобразовать используя toFixed. |
| Автор: solenko 13.5.2008, 11:21 |
| Ну раз "турбовеломобиль", то может стоит посмотреть что-то типа printf? ) http://www.webtoolkit.info/javascript-sprintf.html http://blogs.translucentcode.org/mick/2002/12/04/printf_for_javascript/ Ну, я надеюсь, после моего неудачного примера, вы все же не будете ставить "==" между float и int? |
| Автор: AKS 14.5.2008, 10:22 | ||
Таких типов (float и int) в ES3 не существует. Есть один - Number type. Сами догадайтесь, с каким типом его можно ассоциировать, а вот подсказка:
|