Страницы: 1
почему такой код
выдаёт такое число : 14.399999999999999 ?
из курса математики помню, что должно получиться 14.4
протестил на 4х браузерах с 2-х компов: Opera, Chrome, Fx, показывают 14.399999999999999, ie - 14.399999999999998
Отредактировано patt (01-03-2009 19:12:03)
Отсутствует
Это все от округления при вычислениях.
http://javascript.ru/ecmascript/part4#a-4.3.20
http://ru.wikipedia.org/wiki/%D0%A7%D0% … 1%82%D0%B8
http://ru.wikipedia.org/wiki/%D0%A7%D0% … 0.BE.D0.BD
Добавлено 01-03-2009 02:45:04
А для точных вычислений требуются инструменты посерьезнее.
Прошлое – это локомотив, который тянет за собой будущее. Бывает, что это прошлое вдобавок чужое. Ты едешь спиной вперед и видишь только то, что уже исчезло. А чтобы сойти с поезда, нужен билет. Ты держишь его в руках. Но кому ты его предъявишь?
Виктор Пелевин. Желтая стрела
Отсутствует
patt
По вычислениям с повышенной точностью целые талмуды пишут и дело тут совсем не в js, такая петрушка будет наблюдаться на большинстве и других языков. Эта тема не так проста как кажется.
FreeBSD 8.2, IceWM
Отсутствует
http://xpoint.ru/know-how/Articles/FloatingPointNumbers?5
протестил на 4х браузерах с 2-х компов: Opera, Chrome, Fx, показывают 14.399999999999999, ie - 14.399999999999998
Вообще-то
, а в силу конечности регистров (и памяти) компьютеров получаем и
Так что только Осёл не справился с заданием
Если же нужна математическая точность, то и программы для этого надо использовать математические
--- ---
Отсутствует
Forest
Прошлое – это локомотив, который тянет за собой будущее. Бывает, что это прошлое вдобавок чужое. Ты едешь спиной вперед и видишь только то, что уже исчезло. А чтобы сойти с поезда, нужен билет. Ты держишь его в руках. Но кому ты его предъявишь?
Виктор Пелевин. Желтая стрела
Отсутствует
patt
По вычислениям с повышенной точностью целые талмуды пишут и дело тут совсем не в js, такая петрушка будет наблюдаться на большинстве и других языков. Эта тема не так проста как кажется.
я в курсе, что такая проблема есть, но то, что обычные проценты по вкладам js посчитает не правильно было сюрпризом ) другие языки с этой проблемой справились, перед там, как запостить тему проверил на java и php.
Отсутствует
обычные проценты по вкладам js посчитает не правильно
js посчитал правильно. Попробуйте написать 14.4 в шестнадцатиричном (или двоичном) виде и увидите, в чем грабли
Проценты по вкладам? Сколько надо знаков после запятой оставить? Два? Тогда так, например:
или то же, но сдвигами влево-вправо.
Будет правильно работать даже в самых древних браузерах (как всегда, кроме осла - тот младше IE 4 может слегка врать )
Или так, скажем:
var x=число, которое мы округляем. var n=число знаков после запятой, которое нам надо получить. var s; // тут будет строковое представление числа, готовое для вывода с нужной точностью s=String(Math.round(x*Math.pow(10, n))); s=s.substr(0,s.length-n)+"."+s.substr(s.length-n-1);
Надо нам три знака после запятой - забиваем n=3; x=14.399999999
В первой строке x умножится на 1000, потом округлится и преобразуется в строку "14400", вторая строчка сделает из него "14.400". Вот и всё
Отредактировано alex_past (03-03-2009 16:28:25)
Отсутствует
patt
я в курсе, что такая проблема есть, но то, что обычные проценты по вкладам js посчитает не правильно было сюрпризом ) другие языки с этой проблемой справились, перед там, как запостить тему проверил на java и php.
Эта проблема к языкам имеет мало отношения, так как как правило проблема именно в МАШИННОМ округлении.
То, что конкретный пример на одном языке получился, а на другом нет, мб простым везением.
Тут надо использовать либо библиотеки для финансовых вычислений/работы с произвольной точностью/символьных вычислений, либо специально созданные языки (тот же COBOL), ну или просто использовать самые "длинные" типы данных + оптимизировать вычисление выражений с тз финальной погрешности (наверняка они все простые и их не так много).
--- ---
Отсутствует
Страницы: 1