Результат вычислений в экспоненциальной форме
Здравствуйте, товарищи!
Сегодня решил начать изучение JavaScript. Купил книжку, весь день увлеченно ее читал, и решил (ясное дело) написать чего-нибудь. Остановился на экспоненциальной форме записи чисел. Судя по всему, результаты вычислений над большими числами записываются именно в такой форме. То есть вместо того, чтобы представить результат как 0.00000000000007, JS делает так: 7e-14. Так вот, решил я написать функцию, переводящую такой результат в "нормальный". Получилось следующее: <html> <head> <script> function NoExp(str_number) { var IsExp = 0; var chrLen = 0; var dotPosition = 0; var i = 0; IsExp = str_number.lastIndexOf("-"); if (IsExp > 0) { chrLen = str_number.substr(IsExp + 1, str_number.length - IsExp - 1); str_number = str_number.substring(0, IsExp - 1); dotPosition = str_number.indexOf("."); str_number = str_number.replace(".", ""); while (i < chrLen - dotPosition) { str_number = "0" + str_number; i++; } str_number = "0," + str_number; alert(str_number); } IsExp = str_number.lastIndexOf("+"); if (IsExp > 0) { chrLen = str_number.substr(IsExp + 1, str_number.length - IsExp - 1); str_number = str_number.substring(0, IsExp - 1); dotPosition = str_number.length - str_number.indexOf(".") - 1; alert(dotPosition); str_number = str_number.replace(".", ""); while (i < chrLen - dotPosition) { str_number = str_number + "0"; i++; } str_number = str_number; alert(str_number); } } </script> </head> <input type="button" onclick="NoExp('33.2424e-8')" value="OK"> </html> (Ох, даже стыдно показывать этот бред.) Оцените, пожалуйста. А еще лучше - расскажите про правильный алгоритм. И еще вопрос. В каких случаях в конце строчки кода ставится точка с запятой? Не совсем понимаю. Огромное спасибо за внимание! |
function NoExp(s){ return s.toFixed(100).replace(/(.*0\.0*[1-9]*)0+\d*/g,'$1') } |
согласно стандарту ЕСМА, в конце строчки точка с запятой ";" может как ставиться, так и не ставиться.
p.s. 2 ZoNT - это пять! |
Спасибо всем.
Насколько мне стало известно, аргумент метода toFixed не может принимать значение, большее 20. И еще, toFixed не поддерживается в Netscape. Какие еще могут быть варианты преобразования экспоненциального числа? |
Цитата:
|
Где-то читал...
Но там говорилось про n-версии Netscape (не помню точно, но что-то типа 4-6). Хотя у меня в седьмой версии все нормально работает (сейчас проверил). Просьба. Объясните мне пожалуйста смысл вот этой строчки: replace(/(.*0\.0*[1-9]*)0+\d*/g,'$1') |
Цитата:
|
:)
|
когда нет желания думать - это диагноз...
|
Цитата:
|
ZoNT,
1) параметр toFixed не должен быть больше 20 2) непонятно, как оно работает (если честно, я тоже забил разбираться) 3) оно не решает задачу (например, при 7e-30) Sharp, стоит сразу договориться, что вопрос теоретический (т.е. на практике вряд ли встретится). По-крайней мере, мне не пришла в голову конкретная ситуация, когда это может понадобится |
Вполне может быть, что моё решение не работает, так как я тестил только в консоли в ФФ:
![]() Ну и конечно же оно не предназначено для случая е+ |
Цитата:
f = 96МГц L = 0.274мкГн В результате вычислений (результат в Фарадах) получается, что искомое значение емкости равно: 1.0031069383690234e-11Ф В неэкспоненциальной форме этот результат выглядит как 0.0000000000100031069383690234Ф, что более привычно глазу. 0.0000000000100031069383690234Ф приблизительно равно 10пФ. P.S. На самом деле я такую программу действительно пишу, вернее, почти написал (вчера начал). Осталось только разобраться в выводом результата в неэкспоненциальной форме. Как считаете, что мне с ним сделать? |
Более привычно глазу в пФ, вот и выводите результат в них.
|
Впринципе, самый компромиссный режим - выводить в микрофарадах.
Хотя, стоп. Можно сделать рядом с полем вывода результата специальный низспадающий список, в котором можно будет выбрать дольную/кратную единицу измерения, и в соответствии с выбранным значением, результат отформатируется. Вот, ИМХО, самое разумное решение. Kolyaj, как считаете? |
Я бы стал выводить сразу в тех единицах, в которых легче воспринять результат. Т.е. если результат достаточно большой, то в микро, если маленький, то в пико.
|
Согласен, хороший вариант.
Вот моя реализация: <script> function formatResult(a) { var b = ""; if (a < 0.000000001) {a = a * 1000000000000; b = a + "пФ"} if (a < 0.000001) {a = a * 1000000000; b = a + "нФ"} if (a < 0.1) {a = a * 1000000; b = a + "мкФ"} if (a < 1) {b = a + "Ф"} return b; } </script> <input name="txtResult" value="0.0025"> <input type="button" onclick="alert(formatResult(txtResult.value))"> Можно ли это как-нибудь оптимизировать? |
Sharp, удобнее результат 0,1 пФ (для 1.0031069383690234e-11Ф), может быть с большей, заранее заданной точностью
кроме того, удобнее, чтобы результат выдавался в одних и тех же единицах. Но к универсальному калькулятору это не применимо - лучше твой вариант, только точность ограничить можно, думаю p.s. универсальные решения чем-то сродни теоретическим, похоже ZoNT, а как насчет 7e-150? и почему не replace(/0*$/, '') ? |
Ну, я бы не стал такие вычисления на js делать, поэтому и не стал бы думать даже над такой функцией... Да и не представляю я, зачем мне нужно перед глазами число, в котором более 12 нулей подряд... Мне наоборот импонирует запись в экспоненциальной форме.
Почему не replace(/0*$/, '')??? ну попробуй сделать alert(3.23e-7.toFixed(100))... Посмотри, что получится... |
Цитата:
Цитата:
|
Часовой пояс GMT +3, время: 00:05. |